2013-11-10 41 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

相關問題