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
答案 0 :(得分:1)
尝试一下:
data
说明:
对于单个条目,我们将其分成一个或多个逗号/空格:
sm_agg$x <- sapply(strsplit(sm_agg$x, "[ ,]+"), function(i) sum(as.numeric(i)))
sm_agg
# Group.1 x
# 1 1001 8.000000
# 2 1002 24.000000
# 3 1003 8.000000
# 4 1004 16.000000
# 5 1005 13.333333
# 6 1006 4.000000
# 7 1007 4.000000
# 8 1008 4.000000
# 9 1009 5.333333
# 10 1010 13.333333
# 11 1011 12.000000
# 12 1012 5.333333
# 13 1013 13.333333
# 14 1014 8.000000
# 15 1015 5.333333
# 16 1016 5.333333
因此,我们要转换为数字并加,所以
strsplit(sm_agg$x[2], "[, ]+")
# [[1]]
# [1] "16" "8"
我们希望对每个元素都执行此操作,因此我们将as.numeric(strsplit(sm_agg$x[2], "[, ]+")[[1]])
# [1] 16 8
sum(as.numeric(strsplit(sm_agg$x[2], "[, ]+")[[1]]))
# [1] 24
的输出输入到strsplit
匿名函数中。
如果您的框架中有sapply
而不是字符串,请改用
factor
最后编辑
我认为您的数据实际上是嵌入式sapply(strsplit(as.character(sm_agg$x), "[ ,]+"), function(i) sum(as.numeric(i)))
。当数据包含一个列表列时,它会像这样显示(我觉得有些沮丧,但仍然...)。
我将生成一些虚假数据以证明我认为您实际拥有的东西:
list
好的。当我们尝试sm2 <- data.frame(Group.1 = c("1001", "1002", "1003", "1005"))
sm2$x <- list(c(8L), c(16L,8L), c(8L), c(16/3, 8))
sm2
# Group.1 x
# 1 1001 8
# 2 1002 16, 8
# 3 1003 8
# 4 1005 5.333333, 8.000000
甚至是strsplit
时,事情都破裂了,显然不像数字:
as.character
实际上,我们要做的只是将它们加起来,因为它们已经是数字了。
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
:
character
这将导致我们的“简单”解决方案失败。
sm2$y <- list(c("8"), c(16L,8L), c(8L), c(16/3, 8))
sm2
# Group.1 x y
# 1 1001 8 8
# 2 1002 16, 8 16, 8
# 3 1003 8 8
# 4 1005 5.333333, 8.000000 5.333333, 8.000000
幸运的是,我们可能有点过分使用,将字符串强制为数字,而将数字强制为数字:
sapply(sm2$y, sum)
# Error in FUN(X[[i]], ...) : invalid 'type' (character) of argument
答案 1 :(得分:1)
我们可以使用separate_rows
将逗号分隔的小肠分成不同的行,然后按组sum
进行
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))
答案 2 :(得分:0)
使用这种方法我得到sapply(sm2 $ y,function(i)sum(as.numeric(i)))