首页 > 解决方案 > 在 r 中编写 for 循环以组合具有匹配名称的列(几乎没有差异)

问题描述

我有一个数据框,其中列名重复一次。现在我需要将它们组合起来以获得正确的数据集。我可以使用dplyrselect 命令提取匹配的列并在以后组合它们。但是,我希望使用for循环来实现它。

#Example data frame

x <- c(1, NA, 3)
y <- c(1, NA, 4)
x.1 <- c(NA, 3, NA)
y.1 <- c(NA, 5, NA)

data <- data.frame(x, y, x1, y1)

##with `dplyr` I can do like 

t1 <- data%>%select(contains("x"))%>%
mutate(x = rowSums(., na.rm = TRUE))%>%
select(x)
t2 <- data%>%select(contains("y"))%>%
mutate(y = rowSums(., na.rm = TRUE))%>%
select(y)

data <- cbind(t1,t2)

这很麻烦,因为我有超过 25 个类似的列

如何通过匹配列名和执行使用 for 循环来实现相同的结果rowSums。甚至使用简单的方法dplyr也会有所帮助。

标签: rfor-loopdplyr

解决方案


我们可以使用split.default基于列名的子串拆分成a list,然后应用rowSums

library(dplyr)
library(stringr)
library(purrr)
data %>%
    split.default(str_remove(names(.), "\\.\\d+")) %>%
    map_dfr(rowSums, na.rm = TRUE)
# A tibble: 3 x 2
#      x     y
#  <dbl> <dbl>
#1     1     1
#2     3     5
#3     3     4

如果我们想使用for循环

un1 <- unique(sub("\\..*", "", names(data)))
out <- setNames(rep(list(NA), length(un1)), un1)
for(un in un1) {
     out[[un]] <- rowSums(data[grep(un, names(data))], na.rm = TRUE)
 }
as.data.frame(out)

数据

data <- structure(list(x = c(1, NA, 3), y = c(1, NA, 4), x.1 = c(NA, 
3, NA), y.1 = c(NA, 5, NA)), class = "data.frame", row.names = c(NA, 
-3L))

推荐阅读