如何自动填充空白列
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
或者另一个选项是 colSums
和 rowsum
{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))
我正在尝试从我的原始数据集中获取两列总和的列表,从左到右
我做了一个循环:
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
或者另一个选项是 colSums
和 rowsum
{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
-
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))