所以我想要做的是为每一行创建一个平均值,但只包括每隔一列。一个示例 df 是:
C1<-c(3,2,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,3)
C4<-c(5,4,3,6,3)
C5<-c(5,6,3,6,2)
C6<-c(5,5,3,6,4)
C7<-c(5,6,3,6,1)
C8<-c(5,7,3,6,2)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3, C4=C4, C5=C5, C6=C6, C7=C7, C8=C8)
DF
ID C1 C2 C3 C4 C5 C6 C7 C8
1 A 3 3 5 5 5 5 5 5
2 B 2 7 4 4 6 5 6 7
3 C 4 3 3 3 3 3 3 3
4 D 4 4 6 6 6 6 6 6
5 E 5 5 3 3 2 4 1 2
所以现在我想计算 C2、C4、C6 和 C8 的平均值并将其添加为 df 中的一个新列。我试过的是这样的:
DF$mean <- rowMeans(DF[seq(2, nrow(dat_all_b), 2),])
这是产生的错误:“Fehler in $<-.data.frame
(*tmp*
, frequency_mean, value = c(350
= NA, :
替换有 14 行,数据有 30"
费勒 = 错误
我的实际 df 有更多的列,我想计算每隔一列的平均值。 预期输出:
DF
ID C1 C2 C3 C4 C5 C6 C7 C8 mean_1
1 A 3 3 5 5 5 5 5 5 4,5
2 B 2 7 4 4 6 5 6 7 5,75
3 C 4 3 3 3 3 3 3 3 3
4 D 4 4 6 6 6 6 6 6 5,5
5 E 5 5 3 3 2 4 1 2 3,5
任何帮助将不胜感激!
答案 0 :(得分:1)
这是一个 dplyr 解决方案:
library(tidyverse)
DF %>%
rowwise() %>%
mutate(mean = mean(c(C1, C2), na.rm=TRUE))
答案 1 :(得分:0)
您可以将 rowMeans
用于每第二列:
DF$mean_1 <- rowMeans(DF[seq(3, ncol(DF), 2)], na.rm = TRUE)
DF
# ID C1 C2 C3 C4 C5 C6 C7 C8 mean_1
#1 A 3 3 5 5 5 5 5 5 4.50
#2 B 2 7 4 4 6 5 6 7 5.75
#3 C 4 3 3 3 3 3 3 3 3.00
#4 D 4 4 6 6 6 6 6 6 5.50
#5 E 5 5 3 3 2 4 1 2 3.50
这给出了 C2
、C4
、C6
和 C8
的平均值。我不确定您是否需要另一列名为 mean_2
的列,它表示 C1
、C3
、C5
和 C7
的平均值?
答案 2 :(得分:0)
如果我们离开 ID
列,这将为您提供每个偶数列的平均值。
DF$mean_1 <- rowMeans(DF[(seq_along(DF)[(seq_along(DF) %% 2 == 1)])][-1])
ID C1 C2 C3 C4 C5 C6 C7 C8 mean_1
1 A 3 3 5 5 5 5 5 5 4.50
2 B 2 7 4 4 6 5 6 7 5.75
3 C 4 3 3 3 3 3 3 3 3.00
4 D 4 4 6 6 6 6 6 6 5.50
5 E 5 5 3 3 2 4 1 2 3.50
答案 3 :(得分:0)
我建议研究一下应用系列。 在这种情况下,通过使用 apply 并将边距设置为 1(按行 - 而将其设置为 2 将为您提供按列的平均值)将解决问题。
DF$mean <- apply(DF[,2:ncol(DF)], 1, mean)
请注意,这更加灵活,因为您还可以快速适应许多其他情况。例如,要按行获取最大值,您可以按行将 max 函数应用于数据帧:
DF$max <- apply(DF[,2:ncol(DF)], 1, max)