2013-11-10 40 views
1

我在735-739的数据框中有因子变量。如何将范围因子分解为R中的数字列表

我想将其作为三个数字列(min, mean, max)添加到我的数据框中。

我开始用strsplit

values = sapply(range, function(r) { 
    values = c(strsplit(as.character(r), "-")) 
}) 

我回来长度为1 list类的值:

[1] "735" "739" 

我在什么我下一步应该损失是。我会欣赏一个提示。

+2

什么你的数据框看起来像什么?一个[可重现的例子](http://stackoverflow.com/q/5963269/)会有所帮助。 'dput(head(...))' –

回答

1

有几种方法可以做到这一点。下面是一个开始concat.split.multiple从我的“splitstackshape”套餐:

## SAMPLE DATA 
mydf <- data.frame(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220")) 
mydf 
# ID vals 
# 1 A 700-800 
# 2 B 600-750 
# 3 C 100-220 

首先,拆分“丘壑”一栏,如果(使用setnames)需要对其进行重命名,并与rowMeans添加新列。

library(splitstackshape) 

mydf <- concat.split.multiple(mydf, "vals", "-") 
setnames(mydf, c("vals_1", "vals_2"), c("min", "max")) 
mydf$mean <- rowMeans(mydf[c("min", "max")]) 
mydf 
# ID min max mean 
# 1 A 700 800 750 
# 2 B 600 750 675 
# 3 C 100 220 160 

仅供参考,这里有一个更 “通过手” 的方法:

mydf <- data.frame(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220")) 
SplitVals <- sapply(sapply(mydf$vals, function(x) 
    strsplit(as.character(x), "-")), function(x) { 
    x <- as.numeric(x) 
    c(min = x[1], mean = mean(x), max = x[2]) 
    }) 
cbind(mydf, t(SplitVals)) 
# ID vals min mean max 
# 1 A 700-800 700 750 800 
# 2 B 600-750 600 675 750 
# 3 C 100-220 100 160 220 
+0

一个很好的例子。非常感谢。 – duffymo

1

使用@ AnandraMahto的数据集,你也可以使用data.table库 -

library(data.table) 
dt <- data.table(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220")) 

# adding the min and max columns 
splitlist <- strsplit(dt[,vals],"-") 
dt[, minv := as.numeric(sapply(X = splitlist, function(x) x[1]))] 
dt[, maxv := as.numeric(sapply(X = splitlist, function(x) x[2]))] 

#adding mean 
dt[,meanv := mean(minv:maxv), by = "vals"] 
+0

我不喜欢'minv'和'maxv'是字符。你也可以加上这个:'dt [,c(“Min”,“Max”,“Mean”):= list(sapply(splitlist,'[[',1), sapply(splitlist,'[ ,2), sapply(splitlist,function(x) mean(as.numeric(x))))] []' – A5C1D2H2I1M1N2O1R2T1

+0

是的,关于没有字符的第一部分。第二部分,我保持简单,以便更容易理解。我认为唯一的额外费用是通过'splitlist'这种额外的时间来遍历,但我不确定。 – TheComeOnMan

相关问题