r - 在 r 中编写 for 循环以组合具有匹配名称的列(几乎没有差异)
问题描述
我有一个数据框,其中列名重复一次。现在我需要将它们组合起来以获得正确的数据集。我可以使用dplyr
select 命令提取匹配的列并在以后组合它们。但是,我希望使用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
也会有所帮助。
解决方案
我们可以使用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))
推荐阅读
- java - 为什么 `test2()` 方法编译成功,但 `test1()` 没有?
- automation - 从 uipath 中的 salesforce 查询
- r - 简化 for 循环
- spring-boot - Spring Cloud Stream - 集成测试,订阅者不监听事件
- git - 如何 git 撤消合并文件
- c# - 程序在没有任何东西的情况下关闭 C#
- html - Flex如何显示保持垂直对齐的项目表
- regex - 尝试匹配以 ly 结尾但不是比较/最高级形式的副词
- drop-down-menu - 如何将下拉按钮中的列表大小固定为数字并使其在颤动中可滚动?
- java - Observer - 围绕电子邮件接收逻辑的可观察模型