在 dplyr::summarise 中传递一个连接的字符串作为列名
Pass a concatenated string as column name in dplyr::summarise
我正在尝试使用连接的字符串作为列名迭代地执行 dplyr 汇总
Category=c("a","a","b","b","b","c","c","c")
A1=c(1,2,3,4,3,2,1,2)
A2=c(10,11,12,13,14,15,16,17)
tt=cbind(Category,A1,A2)
tdat=data.frame(tt)
colnames(tdat)=c("Category","M1","M2")
ll=matrix(1:2,nrow=2)
for(i in 1:nrow(ll)) {
Aone=tdat %>% group_by(Category) %>%
summarize(Msum=sum(paste("M",i,sep="")))
}
我最后报了下面的错误
x invalid 'type' (character) of argument
ℹ Input Msum is sum(paste("M", i, sep = "")).
ℹ The error occurred in group 1: Category = "A".
Run rlang::last_error() to see where the error occurred.```
The goal is to iteratively get arithmentic functions within summarize function in dplyr. But this concatenated string is not recognized as column name.
如果我们想将字符串作为列名传递,则转换为 sym
bol 并计算 (!!
)
library(dplyr)
Aone <- vector('list', nrow(ll))
for(i in seq_len(nrow(ll))) {
Aone[[i]] <- tdat %>%
group_by(Category) %>%
summarize(Msum = sum(!! rlang::sym(paste("M", i, sep=""))))
}
或者假设列名是 'M-1'、'M-2' 等,它应该也能工作
Aone <- vector('list', 2)
for(i in seq_along(Aone)) {
Aone[[i]] <- tdat %>%
group_by(Category) %>%
summarise(Msum = sum(!! rlang::sym(paste("M-", i, sep=""))),
.groups = 'drop')
}
注意:ll
在原 post 中并不清楚。在这里,我们创建一个 list
,其中 length
等于 'M-' 列的数量,并通过遍历 [=16] 的序列将输出分配回 list
元素=]
数据
tdat <- data.frame(Category, M1, M2)
tdat <- structure(list(Category = c("A", "A", "A", "A", "B", "B", "B",
"B"), `M-1` = c(1, 2, 3, 4, 3, 2, 1, 2), `M-2` = c(10, 11, 12,
13, 14, 15, 16, 17)), class = "data.frame", row.names = c(NA,
-8L))
我正在尝试使用连接的字符串作为列名迭代地执行 dplyr 汇总
Category=c("a","a","b","b","b","c","c","c")
A1=c(1,2,3,4,3,2,1,2)
A2=c(10,11,12,13,14,15,16,17)
tt=cbind(Category,A1,A2)
tdat=data.frame(tt)
colnames(tdat)=c("Category","M1","M2")
ll=matrix(1:2,nrow=2)
for(i in 1:nrow(ll)) {
Aone=tdat %>% group_by(Category) %>%
summarize(Msum=sum(paste("M",i,sep="")))
}
我最后报了下面的错误
x invalid 'type' (character) of argument
ℹ Input Msum is sum(paste("M", i, sep = "")).
ℹ The error occurred in group 1: Category = "A".
Run rlang::last_error() to see where the error occurred.```
The goal is to iteratively get arithmentic functions within summarize function in dplyr. But this concatenated string is not recognized as column name.
如果我们想将字符串作为列名传递,则转换为 sym
bol 并计算 (!!
)
library(dplyr)
Aone <- vector('list', nrow(ll))
for(i in seq_len(nrow(ll))) {
Aone[[i]] <- tdat %>%
group_by(Category) %>%
summarize(Msum = sum(!! rlang::sym(paste("M", i, sep=""))))
}
或者假设列名是 'M-1'、'M-2' 等,它应该也能工作
Aone <- vector('list', 2)
for(i in seq_along(Aone)) {
Aone[[i]] <- tdat %>%
group_by(Category) %>%
summarise(Msum = sum(!! rlang::sym(paste("M-", i, sep=""))),
.groups = 'drop')
}
注意:ll
在原 post 中并不清楚。在这里,我们创建一个 list
,其中 length
等于 'M-' 列的数量,并通过遍历 [=16] 的序列将输出分配回 list
元素=]
数据
tdat <- data.frame(Category, M1, M2)
tdat <- structure(list(Category = c("A", "A", "A", "A", "B", "B", "B",
"B"), `M-1` = c(1, 2, 3, 4, 3, 2, 1, 2), `M-2` = c(10, 11, 12,
13, 14, 15, 16, 17)), class = "data.frame", row.names = c(NA,
-8L))