我想創建一個新列,它是所有以“m_”開頭的列的總和,以及一個新列,它是所有以“w_”開頭的列的總和。不幸的是,它不是每個第 n 列,因此索引所有奇數列和偶數列將不起作用。
columnnames <- c("m_16", "w_16", "w_17", "m_17", "w_18", "m_18")
values1 <- c(3, 4, 8, 1, 12, 4)
values2 <- c(8, 0, 12, 1, 3, 2)
df <- as.data.frame(rbind(values1, values2))
names(df) <- columnnames
我想要得到的是:
columnnames <- c("m_16", "w_16", "w_17", "m_17", "w_18", "m_18", "sum_m", "sum_w")
values1 <- c(3, 4, 8, 1, 12, 4, 8, 24)
values2 <- c(8, 0, 12, 1, 3, 2, 11, 15)
df <- as.data.frame(rbind(values1, values2))
names(df) <- columnnames
到目前為止,在我的搜索程序中,我只發現了如何根據條件對特定列求和,但我不想指定列,因為它們很多。
提前謝謝你的幫助!
uj5u.com熱心網友回復:
另一種可能的解決方案:
library(dplyr)
df %>%
mutate(sum_m = across(starts_with("m")) %>% rowSums) %>%
mutate(sum_w = across(starts_with("w")) %>% rowSums)
#> m_16 w_16 w_17 m_17 w_18 m_18 sum_m sum_w
#> values1 3 4 8 1 12 4 8 24
#> values2 8 0 12 1 3 2 11 15
uj5u.com熱心網友回復:
dplyr有一個快速的答案:
library(dplyr)
df <- df %>%
mutate(
m_col_sum = select(., starts_with("m")) %>% rowSums(),
w_col_sum = select(., starts_with("w")) %>% rowSums()
)
您可能需要指定na.rm = TRUE為rowSums().
uj5u.com熱心網友回復:
# Vector containing the letters which target vectors'
# names start with: names_start_with => character vector
names_start_with <- c("m", "w")
# Compute row-sums, column-bind vectors to data.frame: res => data.frame
res <- cbind(
df,
vapply(
names_start_with,
function(x){
rowSums(df[,startsWith(names(df), x)])
},
numeric(length(names_start_with))
),
row.names = NULL
)
# Output data.frame to console: data.frame => stdout(console)
res
uj5u.com熱心網友回復:
使用inside的基本解決方案。rowSumslapply
cbind(df, lapply(c(sum_m = "m", sum_w = "w"),
\(x) rowSums(df[startsWith(names(df), x)])))
# m_16 w_16 w_17 m_17 w_18 m_18 sum_m sum_w
#values1 3 4 8 1 12 4 8 24
#values2 8 0 12 1 3 2 11 15
或者如果沒有那么多組:
df$sum_m <- rowSums(df[startsWith(names(df), "m")])
df$sum_w <- rowSums(df[startsWith(names(df), "w")])
df
# m_16 w_16 w_17 m_17 w_18 m_18 sum_m sum_w
#values1 3 4 8 1 12 4 8 24
#values2 8 0 12 1 3 2 11 15
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480421.html
