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))