R 如何计算第二列中分隔的逗号和

R 如何计算第二列中分隔的逗号和,r,R,我想要这样 sm_agg Group.1 x 1 1001 8 2 1002 16, 8 3 1003 8 4 1004 16 5 1005 5.33333333333333, 8 6 1006 4 7 1007

我想要这样

sm_agg
   Group.1                   x
1     1001                   8
2     1002               16, 8
3     1003                   8
4     1004                  16
5     1005 5.33333333333333, 8
6     1006                   4
7     1007                   4
8     1008                   4
9     1009    5.33333333333333
10    1010 8, 5.33333333333333
11    1011                8, 4
12    1012    5.33333333333333
13    1013 5.33333333333333, 8
14    1014                   8
15    1015    5.33333333333333
16    1016    5.33333333333333
试试这个:

sm_agg
   Group.1                   x
1     1001                   8
2     1002                   24
3     1003                   8
4     1004                  16
5     1005                  13.3
6     1006                   4
7     1007                   4
8     1008                   4
9     1009    5.33333333333333
10    1010                13.3
11    1011                  12
12    1012    5.33333333333333
13    1013                 13.3
14    1014                   8
15    1015    5.33333333333333
16    1016    5.33333333333333
  • 有了它,我们想要转换成数字并加上,所以

    strsplit(sm_agg$x[2], "[, ]+")
    # [[1]]
    # [1] "16" "8" 
    
  • 我们希望对每个元素都这样做,因此我们将
    strsplit
    输出馈送到
    sapply
    anon函数中


  • 如果您的帧具有
    因子
    s而不是字符串,则使用

    as.numeric(strsplit(sm_agg$x[2], "[, ]+")[[1]])
    # [1] 16  8
    sum(as.numeric(strsplit(sm_agg$x[2], "[, ]+")[[1]]))
    # [1] 24
    

    上次编辑

    我认为您的数据实际上是一个嵌入的
    列表
    。当数据包含一个列表列时,它是这样显示的(我觉得有点令人沮丧,但仍然…)

    我将生成一些虚假数据来证明我认为您实际拥有的数据:

    sapply(strsplit(as.character(sm_agg$x), "[ ,]+"), function(i) sum(as.numeric(i)))
    
    事实上,我们所要做的就是把它们加起来,因为它们已经是数字了

    as.character(sm2$x)
    # [1] "8"                      "c(16, 8)"               "8"                     
    # [4] "c(5.33333333333333, 8)"
    
    如果其中一个嵌套对象碰巧是
    字符

    sapply(sm2$x, sum)
    # [1]  8.00000 24.00000  8.00000 13.33333
    
    幸运的是,我们可以有点手忙脚乱,将字符串强制为数字,将数字强制为数字:

    sapply(sm2$y, sum)
    # Error in FUN(X[[i]], ...) : invalid 'type' (character) of argument
    

    我们可以使用
    separate_rows
    将逗号分隔的条目分隔成不同的行,然后按组使用
    sum

    sapply(sm2$y, function(i) sum(as.numeric(i)))
    # [1]  8.00000 24.00000  8.00000 13.33333
    sapply(sm2$x, function(i) sum(as.numeric(i)))
    # [1]  8.00000 24.00000  8.00000 13.33333
    
    库(tidyverse)
    df%>%
    单独的_行(x,sep=“,”)%>%
    组别(组别1)%>%
    总结(x=总和(作为数字(x)))
    #第1组x
    #      
    # 1    1001  8   
    # 2    1002 24   
    # 3    1003  8   
    # 4    1004 16   
    # 5    1005 13.3 
    # 6    1006  4   
    # 7    1007  4   
    # 8    1008  4   
    # 9    1009  5.33
    #10    1010 13.3 
    #11    1011 12   
    #12    1012  5.33
    #13    1013 13.3 
    #14    1014  8   
    #15    1015  5.33
    #16    1016  5.33
    
    数据

    library(tidyverse)
    df %>%
      separate_rows(x, sep = ",") %>%
      group_by(Group.1) %>%
      summarise(x = sum(as.numeric(x)))
    
    
    #   Group.1  x
    #     <dbl> <dbl>
    # 1    1001  8   
    # 2    1002 24   
    # 3    1003  8   
    # 4    1004 16   
    # 5    1005 13.3 
    # 6    1006  4   
    # 7    1007  4   
    # 8    1008  4   
    # 9    1009  5.33
    #10    1010 13.3 
    #11    1011 12   
    #12    1012  5.33
    #13    1013 13.3 
    #14    1014  8   
    #15    1015  5.33
    #16    1016  5.33
    

    df使用此方法,我在strsplit(sm_agg$x[2],“[,]+”[[1]])中得到了一个非常有用的错误(sm2$y,函数(i)sum(as.numeric(i))

    当我应用此方法时,我得到了错误>as.numeric(strsplit(sm_agg$x[2],“[,]+”)错误:非字符参数>sm_agg$x您的数据中有
    因子
    s。将来,以明确的方式显示数据,例如
    dput(head(sm_agg))
    可以避免这种情况。请参见我的编辑以了解解决方法。>sapply(strsplit(as.character(sm_agg$x),“[,]”函数(i)sum(as.numeric(i))[1]8.000000 NA 8.000000 16.000000 NA 4.000000 4.000000 5.333333 NA[11]NA 5.333333333 NA 8.000000 5.333您忘记了模式中的空格。这个空间不是偶然的,也不是“代码风格偏好”。如果您想更清楚,请将
    “[,]+”
    (注意引号中的空格,总共五个字符)替换为
    “[\\s,]+”
    (此处没有空格,
    \\s
    包括空格和制表符)。sapply(strsplit)(as.character(sm_agg$x),“[,]+”)函数(i)sum(as.numeric(i))[1]8.000000 NA 8.000000 16.000000 NA 4.000000 4.000000 5.333333 NA[11]NA 5.333333 NA 8.000000 5.333333 5.333333警告消息:1:在乐趣中(X[[i]],…):强制引入的NAs 2:在乐趣中(X[[i],…):强制引入的NAs 3:在乐趣中(X[[i],…):强制引入的NAs 4:在乐趣中(X[[i]],…):强制引入的NAs 5:有趣的(X[[i]],…):强制引入的NAs
    sapply(sm2$y, sum)
    # Error in FUN(X[[i]], ...) : invalid 'type' (character) of argument
    
    sapply(sm2$y, function(i) sum(as.numeric(i)))
    # [1]  8.00000 24.00000  8.00000 13.33333
    sapply(sm2$x, function(i) sum(as.numeric(i)))
    # [1]  8.00000 24.00000  8.00000 13.33333
    
    library(tidyverse)
    df %>%
      separate_rows(x, sep = ",") %>%
      group_by(Group.1) %>%
      summarise(x = sum(as.numeric(x)))
    
    
    #   Group.1  x
    #     <dbl> <dbl>
    # 1    1001  8   
    # 2    1002 24   
    # 3    1003  8   
    # 4    1004 16   
    # 5    1005 13.3 
    # 6    1006  4   
    # 7    1007  4   
    # 8    1008  4   
    # 9    1009  5.33
    #10    1010 13.3 
    #11    1011 12   
    #12    1012  5.33
    #13    1013 13.3 
    #14    1014  8   
    #15    1015  5.33
    #16    1016  5.33
    
    df <- structure(list(Group.1 = c(1001, 1002, 1003, 1004, 1005, 1006, 
     1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016), 
        x = structure(c(5L, 7L, 5L, 6L, 10L, 2L, 1L, 1L, 9L, 11L, 
     4L, 8L, 10L, 3L, 8L, 8L), .Label = c("                 4", 
      "                4", "                8", "             8, 4", 
     "       8", "      16", "   16, 8", "  5.33333333333333", 
     " 5.33333333333333", " 5.33333333333333, 8", " 8, 5.33333333333333"
     ), class = "factor")), .Names = c("Group.1", "x"), class = 
     "data.frame", row.names = c(NA, 
     -16L))