【问题标题】:Calculate Mean of Comma-Separated String of Numbers计算逗号分隔的数字字符串的平均值
【发布时间】:2015-07-26 01:11:45
【问题描述】:

我的数据框中有一列由数字字符串组成,用逗号分隔。我想将字符串转换为数字列表,然后得到平均值。我的数据框,df:

a3
1,5,2
103.1
34,6

首先,我将字符串转换为列表:

> df$a3_list <- strsplit(as.character(df$a3), split = ',')

df:

a3    a3_list
1,5,2 c("1", "5", "2")
103.1 103.1
34,6  c("34", "6")

然而,此时我不确定如何获得一个包含df$a3_list 中每个单元格平均值的新列

【问题讨论】:

    标签: r dataframe string-split


    【解决方案1】:

    你可以使用stringi,速度很快

    library(stringi)
    mat <- stri_split_fixed(df$a3, ',', simplify=T)
    mat <- `dim<-`(as.numeric(mat), dim(mat))  # convert to numeric and save dims
    rowMeans(mat, na.rm=T)
    # [1]   2.666667 103.100000  20.000000
    

    或使用 Base R

    sapply(strsplit(as.character(df$a3), ",", fixed=T), function(x) mean(as.numeric(x)))
    

    【讨论】:

    • 我试过df3$a3_mean &lt;- mean(as.numeric(stri_split_fixed(df3$a3, ',', simplify=T)), na.rm=T),但它给了我每行相同的平均值。我想要每一行的单独方法
    • @Adam_G 您在此评论中显示的代码在功能上与 nongkrong 发布的代码不同。
    • 我知道这一点,但我想添加一个新列。 nongkrong 的代码没有这样做。
    • 只做df$newCol &lt;- 任一解决方案
    • @Adam_G 看起来你有一个factor column。所以用as.character 包装它,即。 strsplit(as.character(df3$a3),...
    【解决方案2】:

    另一个base R 选项

     rowMeans(read.table(text=df$a3, sep=",", fill=TRUE), na.rm=TRUE)
     #[1]   2.666667 103.100000  20.000000
    

    注意:假设“a3”是character 类。否则,用as.character(df$a3)包装

    数据

     df <- structure(list(a3 = c("1,5,2", "103.1", "34,6")), .Names = "a3", 
     class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • 我得到“文本连接错误(文本,编码 =“UTF-8”):无效的“文本”参数”
    • @Adam_G 我使用的`数据已在帖子中更新。我没有收到任何错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2017-11-27
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多