对数据帧中的数字字符串执行功能

时间:2015-11-22 14:16:48

标签: r

如果我有一个简单的数据框,其样本和数字表示为如下字符:

Sample     Vals
 A         1,2,3,4,5
 B         3,4,5,6,7
 C         6,7,8

这样我们就可以将字符串转换和操作为数字(或传递给函数)以获得类似于均值(或其他)的内容。

Sample     Vals         Mean
 A         1,2,3,4,5    3
 B         3,4,5,6,7    5
 C         6,7,8        7

我遇到的挑战是类型转换。例如,我可以通过

拆分val
df$Vals<-strsplit(df$Vals, ",")

但是将它转换为数字或整数会变得有点棘手,即使尝试使用&#39; as.numeric&#39;等等。看起来像一个相当直接的事情,但我试图找到一个合适的答案无济于事。

3 个答案:

答案 0 :(得分:3)

使用base R,我们可以用逗号strsplit拆分列,然后找到mean。读取数据时务必设置stringsAsFactors=FALSE

df$Mean <- sapply(strsplit(df$Vals, ","), function(x) mean(as.numeric(x)))
df
#  Sample      Vals Mean
#1      A 1,2,3,4,5    3
#2      B 3,4,5,6,7    5
#3      C     6,7,8    7

答案 1 :(得分:2)

我们可以使用data.table。按“示例”分组,我们将“Vals”分为,,转换为“数字”获取mean并将其分配(:=)作为“均值”列。

library(data.table)
setDT(df1)[,Mean := mean(as.numeric(strsplit(Vals, ',')[[1]])) , by = Sample]
df1
#   Sample      Vals Mean
#1:      A 1,2,3,4,5    3
#2:      B 3,4,5,6,7    5
#3:      C     6,7,8    7

或者使用cSplit,我们将'Vals'除以,,得到'Vals'的mean,按'Sample'分组。

library(splitstackshape)
cSplit(df1, 'Vals', ',', 'long')[, list(Vals=toString(Vals), 
                       Mean=mean(Vals)) , by = Sample]

答案 2 :(得分:2)

使用data.table的另一个选项是合并tstrsplitrowMeans,从而避免使用行操作数

library(data.table) #V1.9.6+
setDT(df)[, Mean := rowMeans(setDT(tstrsplit(Vals, ",", type.convert = TRUE)), na.rm = TRUE)]
#    Sample      Vals Mean
# 1:      A 1,2,3,4,5    3
# 2:      B 3,4,5,6,7    5
# 3:      C     6,7,8    7