将r中的多组列加在一起

时间:2018-09-18 21:13:08

标签: 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将列添加到gether的函数:

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

mapply(fun1,df,col0,col5)

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

有想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用map2包中的purrr一次遍历两个向量:

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

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

purrr::map2(col0, col5, function(x, y) {
  df[[x]] <<- df[[x]] + df[[y]]
})

> df
  key ab0 ab1 ab5 bc0 bc1 bc5 df0 df1 df5
1   1   2   0   1   0   2   0   1   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   1   0   0
5   5   2   0   1   1   0   1   6   0   6

答案 1 :(得分:1)

假设两个数据帧的长度相同,只需将它们的子集列加在一起。无需循环。所有向量化操作。

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

答案 2 :(得分:0)

这是一种使用import { AfterViewInit, Component, ElementRef, QueryList, ViewChildren } from '@angular/core'; ... @ViewChildren('roleMenuButton') roleMenuButtons: QueryList<ElementRef>; ... ngAfterViewInit(){ let elements = this.roleMenuButtons.toArray(); console.log(elements); } 元数据包中的tidyrdplyr的方法。

首先,我将表格转换为长(整洁)格式,并将该列分为两个部分,并按这些部分的数字部分进行散布。

然后我执行您描述的计算。

最后,我按照步骤1的相反步骤将其恢复为原始格式。

tidyverse