Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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,如果我有一个简单的数据框,其样本和数字表示为如下字符: Sample Vals A 1,2,3,4,5 B 3,4,5,6,7 C 6,7,8 这样我们就可以将字符串转换为数字(或传递给函数)并对其进行操作,从而得到类似于平均值的值(或其他值) 我面临的挑战是类型转换。例如,我可以通过 df$Vals<-strsplit(df$Vals, ",") df$Vals我们可以使用data.table。按“样本”分组,我们将“VA

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

Sample     Vals
 A         1,2,3,4,5
 B         3,4,5,6,7
 C         6,7,8
这样我们就可以将字符串转换为数字(或传递给函数)并对其进行操作,从而得到类似于平均值的值(或其他值)

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

df$Vals<-strsplit(df$Vals, ",")

df$Vals我们可以使用
data.table
。按“样本”分组,我们将“VAL”按
进行拆分,转换为“数值”,获得
平均值
,并将其分配(
:=
)为“平均值”列

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
,我们将“VAL”除以
,得到“VAL”的
平均值,按“样本”分组

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

使用
base R
我们可以使用
strsplit
用逗号分割列,然后找到
平均值。读取数据时,确保将
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

df$Mean使用
数据的另一个选项。表
是将
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

好的,是的,这很有帮助。我没有将StringsFactors设置为FALSE
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