如何将范围因子拆分为R中的数字列表
我在数据框中有一个因子变量,其形式为如何将范围因子拆分为R中的数字列表,r,R,我在数据框中有一个因子变量,其形式为735-739 我想将其作为三个数字列添加到我的数据框中 我从使用strsplit开始: values = sapply(range, function(r) { values = c(strsplit(as.character(r), "-")) }) 我得到一个长度为1的classlist值: [1] "735" "739" 我不知道下一步该怎么做。请给我一个提示。有几种方法可以做到这一点。以下是我的“splitstackshape”软件包中以
735-739
我想将其作为三个数字列添加到我的数据框中
我从使用strsplit开始:
values = sapply(range, function(r) {
values = c(strsplit(as.character(r), "-"))
})
我得到一个长度为1的classlist
值:
[1] "735" "739"
我不知道下一步该怎么做。请给我一个提示。有几种方法可以做到这一点。以下是我的“splitstackshape”软件包中以
concat.split.multiple开头的一个:
作为参考,这里有一个更“手工”的方法:
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
mydf使用@anandramato的数据集,您还可以使用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"]
库(data.table)
dt您的数据帧是什么样子的?A会有帮助的dput(head(…)
我不喜欢minv
和maxv
是字符。您还可以将其复合:dt[,c(“Min”,“Max”,“Mean”):=list(splitlist,
[[,1),sapply(splitlist,
[,2),sapply(splitlist,函数(x)Mean(as.numeric(x)))[]
是的,第一部分是关于没有字符的。第二部分,我保持简单,以便更容易理解。我认为唯一的额外成本是以这种方式额外遍历拆分列表一次,但我不确定。
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
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"]