r - 将 r 中的多组列加在一起

标签 r multiple-columns mapply multiple-arguments

我正在尝试将多组列添加在一起。

示例 df:

  df <- data.frame(
  key = 1:5,
  ab0 = c(1,0,0,0,1),
  ab1 = c(0,2,1,0,0),
  ab5 = c(1,0,0,0,1),
  bc0 = c(0,1,0,2,0),
  bc1 = c(2,0,0,0,0),
  bc5 = c(0,2,1,0,1),
  df0 = c(0,0,0,1,0),
  df1 = c(1,0,3,0,0),
  df5 = c(1,0,0,0,6)
)

给我:

  key ab0 ab1 ab5 bc0 bc1 bc5 df0 df1 df5
1   1   1   0   1   0   2   0   0   1   1
2   2   0   2   0   1   0   2   0   0   0
3   3   0   1   0   0   0   1   0   3   0
4   4   0   0   0   2   0   0   1   0   0
5   5   1   0   1   0   0   1   0   0   6

我想将所有包含 0 和 5 的列组添加在一起,并将它们放置在 0 列中。

所以最终结果是:

  key ab0 ab1 ab5 bc0 bc1 bc5 df0 df1 df5
1   1   2   0   1   0   2   0   0   1   1
2   2   0   2   0   3   0   2   0   0   0
3   3   0   1   0   1   0   1   0   3   0
4   4   0   0   0   2   0   0   2   0   0
5   5   2   0   1   1   0   1   0   0   6

我可以使用 3 行将列添加在一起:

df$ab0 <- df$ab0 + df$ab5
df$bc0 <- df$bc0 + df$bc5
df$df0 <- df$df0 + df$df5

但是我的真实示例有一百多个列,因此我想迭代它们并使用 apply。

第一组的列名称包含在 col0 中,第二组的列名称包含在 col5 中。

col0 <- c("ab0","bc0","df0")
col5 <- c("ab5","bc5","df5")

我创建了一个函数来使用 mapply 将列添加到一起:

fun1 <- function(df,x,y) {
  df[,x] <- df[,x] + df[,y]
}

mapply(fun1,df,col0,col5)

但我收到错误:df[, x] 中的错误:维度数不正确

想法?

最佳答案

只需将两个数据帧通过其子集列添加在一起,假设它们的长度相同。不需要循环。全矢量化操作。

final_df <- df[grep("0", names(df))] + df[grep("5", names(df))]

final_df <- cbind(final_df, df[grep("0", names(df), invert=TRUE)])     

final_df <- final_df[order(names(final_df))]
final_df

#   ab0 ab1 ab5 bc0 bc1 bc5 df0 df1 df5 key
# 1   2   0   1   0   2   0   1   1   1   1
# 2   0   2   0   3   0   2   0   0   0   2
# 3   0   1   0   1   0   1   0   3   0   3
# 4   0   0   0   2   0   0   1   0   0   4
# 5   2   0   1   1   0   1   6   0   6   5

Rextester demo

关于r - 将 r 中的多组列加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394668/

相关文章:

r - 在矩阵上使用带有均值函数的 mapply

r - 在 R 中按条件合并行

r - 如何使用 bigmemory 包加载具有混合类型列的大 csv 文件

r - 将数据帧转换为矩阵,其中df的第1列作为矩阵的行名

html - CSS - 2列布局

r - 使用mapply计算多个列表的均值

r - 在 R 中的双循环中传递带有参数作为列的函数

r - Complete.cases() 和 data[is.na(data)] <- 0 的结果有何不同?

python: 如果一个数字在某个范围内,则返回该范围对应的字符串

r - 将列名与 R 中的列数据连接起来(使用 data.table)