如果我有一个简单的数据框,其样本和数字表示为如下字符:
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
我遇到的挑战是类型转换。例如,我可以通过
拆分valdf$Vals<-strsplit(df$Vals, ",")
但是将它转换为数字或整数会变得有点棘手,即使尝试使用&#39; as.numeric&#39;等等。看起来像一个相当直接的事情,但我试图找到一个合适的答案无济于事。
答案 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
的另一个选项是合并tstrsplit
和rowMeans
,从而避免使用行操作数
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