我有一个10列的 Dataframe 。
我需要
- 首先对列1+2和3+4求和,
- 然后对5+6+7列和8+9+10列求和;
- 并保存为 Dataframe 。
我已经使它工作(见下文),但手动,使用2个sapply
函数,然后t
和rbind
,因此我寻求更优雅的解决方案。
列名称显示出明显的模式。
- 前4列 * 的列表如下所示:
“on_b_, off_b_”
并重复(因此,我对列 1和2 求和,然后对列 3和4 求和) - 接下来的6列 * 的列表看起来像这样:
“on_b_, something else in between, off_b_”
并重复(因此我总结了 5 & 6 & 7,然后是 8 & 9 & 10)
我需要函数在再次看到列表开头时重新启动.开头的是名称以on_b_
开头的列:
on_B_,(中间完全不相关的其他内容,如CC_,或根本不存在),off_b_
以下是可重现的代码块:
df = structure(list(on_b_pos_1 = 64, off_b_4 = 25,
on_b_6 = 28, off_b_8 = 157,
on_b_3 = 42, CC_2 = 0, off_b_4 = 125,
on_b_5 = 51, CC_7 = 0, off_b_8 = 15),
row.names = 14L, class = "data.frame")
这是我以前做过的,它有效:
# adding together TWO columns
a <- data.frame(sapply(seq(1,4,by=2),function(i) rowSums(df[,i:(i+1)])))
# check whether the function i is getting the correct columns where it restarts
# seq(1,4,by=2)
# adding together THREE columns
b <- data.frame(sapply(seq(5,ncol(df),by=3),function(i) rowSums(df[,i:(i+2)])))
# transpose
a <- t(a)
b <- t(b)
c <- cbind(a, b)
结果应该是这样的:
Column 1 Column 2 Column 3 Column 4
89 185 167 66
2条答案
按热度按时间31moq8wy1#
您可以使用
purrr
包中的map2
函数,在其中查找以grep
的“on”或“off”开头的列索引。如果您的
df
中有多个行,请使用sapply
或map
Package 我的代码以迭代这些行。unhi4e5o2#
不知道你会认为什么是优雅的-这里是一个Tidyverse解决方案(大约比我的机器上@benson23的解决方案慢16倍):
创建于2023-04-12带有reprex v2.0.2