Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将范围因子拆分为R中的数字列表_R - Fatal编程技术网

如何将范围因子拆分为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的class
list
值:

[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"]