如何自动填充空白列

How to automatically fill in a blank column

我正在尝试从我的原始数据集中获取两列总和的列表,从左到右

我做了一个循环:

for (i in 1:ncol(df)) { 
m = i
n = i + 1
if (i %% 2 != 0) {
df_cum$V1 <- sum(df[,m] + df[,n])
}
}

但是,给新列表加值的方式是错误的:

df_cum$V1 <- sum(df[,m] + df[,n])

如果有人知道如何在 R 中做到这一点,我们将不胜感激

您可以尝试split.default(),即

sapply(split.default(df, gsub('\d+', '', names(df))), sum)
 A  B 
17 12 

我们可以在 tidyverse

library(dplyr)
library(tidyr)
df1 %>%   
    pivot_longer(everything(), names_to = c(".value", "grp"), 
           names_sep ="(?<=[A-Z])(?=[0-9])") %>%
    select(-grp) %>%    
    summarise(across(everything(), sum, na.rm = TRUE), .groups = 'drop')

-输出

# A tibble: 1 x 3
      A     B     C
  <dbl> <dbl> <dbl>
1    17    12    13

或使用base R

aggregate(values ~ ., transform(stack(df1), 
            ind = sub("\d+", "", ind)), FUN = sum)
  ind values
1   A     17
2   B     12
3   C     13

base R

rowsum 的另一个选项
with(stack(df1), rowsum(values, group = trimws(ind, whitespace = "\d+")))
  [,1]
A   17
B   12
C   13

或者另一个选项是 colSumsrowsum

{tmp <- colSums(df1); rowsum(tmp, group = substr(names(tmp), 1, 1))}
  [,1]
A   17
B   12
C   13

数据

df1 <- structure(list(A1 = c(0, 3, 2), A2 = c(2, 6, 4), B1 = c(3, 0, 
1), B2 = c(2, 3, 3), C1 = c(7, 3, 2), C2 = c(1, 0, 0)), 
  class = "data.frame", row.names = c(NA, 
-3L))

使用 tapply -

的基础 R 选项
tapply(unlist(df), 
       rep(1:ncol(df), each = nrow(df) * 2, length.out = nrow(df) * ncol(df)), 
       sum)

# 1  2  3 
#17 12 13 

这里的逻辑是每 2 列创建一个组,sum 它们。

数据

如果您在 reproducible format

中提供数据,会更容易提供帮助
df <- data.frame(A1 = c(0, 3, 2), A2 = c(2, 6, 4), 
                 B1 = c(3, 0, 1), B2 = c(2, 3, 3), 
                 C1 = c(7, 3, 2), C2 = c(1, 0, 0))