【问题标题】:Expand data frame and and add rowsums from another dataframe展开数据框并添加来自另一个数据框的行和
【发布时间】:2021-02-22 09:26:17
【问题描述】:

由于我的实际数据集非常大,我正在尝试找到一种更快的方法来完成以下代码。我想完全摆脱 for 循环。我正在尝试根据values 中的列数将xdf 中的每一行复制到一个新的数据框中。然后,在新数据集中的每个条目旁边,显示从 values 中的第 1 列到 j 列的行总和。

xdf <- data_frame(
  x = c('a', 'b', 'c'),
  y = c(4, 5, 6),
)

values <- data_frame(
  col_1 = c(5, 9, 1),
  col_2 = c(4, 7, 6),
  col_3 = c(1, 5, 2),
  col_4 = c(7, 8, 5)
)

for (j in seq(ncol(values))){
  if (j==1){
    Temp <- cbind(xdf, z= rowSums(values[1:j]))
  }
  else{
    Temp <- rbind(Temp, cbind(xdf, z= rowSums(values[1:j])))
  }
}

print(Temp)

输出应该是:

   x y  z
1  a 4  5
2  b 5  9
3  c 6  1
4  a 4  9
5  b 5 16
6  c 6  7
7  a 4 10
8  b 5 21
9  c 6  9
10 a 4 17
11 b 5 29
12 c 6 14

有没有更短的方法来完成这个?

这是我能得到的最接近的答案。 How to expand data frame based on values?

我是 R 新手,很抱歉冗长的代码。

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    这是一个基本的 R 选项:

    重复xdf 中的行,因为values 中有许多列,一次迭代增加一列以找到rowSums 并将其作为新列添加到最终数据框中。

    newdf <- xdf[rep(seq(nrow(xdf)), ncol(values)), ]
    newdf$z <- c(sapply(seq(ncol(values)), function(x) rowSums(values[1:x])))
    newdf
    
    # A tibble: 12 x 3
    #   x         y     z
    #   <chr> <dbl> <dbl>
    # 1 a         4     5
    # 2 b         5     9
    # 3 c         6     1
    # 4 a         4     9
    # 5 b         5    16
    # 6 c         6     7
    # 7 a         4    10
    # 8 b         5    21
    # 9 c         6     9
    #10 a         4    17
    #11 b         5    29
    #12 c         6    14
    

    @sindri_baldur 建议的简洁单行不需要明确重复行。

    cbind(xdf, z = c(sapply(seq(ncol(values)), function(x) rowSums(values[1:x]))))
    

    【讨论】:

    • 您可以通过 cbind(xdf, z = c(sapply(seq(ncol(values)), function(x) rowSums(values[1:x])))) 节省第一步并依靠回收。
    猜你喜欢
    • 2018-08-04
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2020-07-24
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多