rowMeans如果列名是数字

时间:2015-12-08 02:07:49

标签: r average numeric calculated-columns

我的datafram看起来像:

数据我看起来像..

 Tester Type    Subject Type    Time        1     2     3
 TType1         SType1          Day 1       11    2     1         
 TType1         SType2          Day 1       3     2     13
 TType1         SType1          Day 2       2     3     15
 TType2         SType3          Day 2       1     4     3
 TType3         SType3          Day 2       2     3     4
 TType1         SType1          Day 1       7     2     2
 TType2         SType1          Day 2       2     6     7

所以我的列名是c(Tester.Type, Subject.Type, Time, 1, 2, 3)

我想创建一个计算行均值的列,但仅当列名是数字时才这样。

我知道如何直接做到:

avgdata <- rowMeans(data[,c(4:6)],na.rm=TRUE)

但有没有办法进行编码,以便在列名为数字(is.numeric)时自动获取?

这样,如果我有更多具有数字列名称的列,我不必更改列范围?

谢谢。

3 个答案:

答案 0 :(得分:2)

当您读入数据时。请记住使用参数check.names=F

df1 <- read.table(text="
TesterType    SubjectType    Time        1     2     3
TType1         SType1          Day1       11    2     1
TType1         SType2          Day1       3     2     13
TType1         SType1          Day2       2     3     15
TType2         SType3          Day2       1     4     3
TType3         SType3          Day2       2     3     4
TType1         SType1          Day1       7     2     2
TType2         SType1          Day2       2     6     7",
                 head=T, as.is=T, check.names = F)

df1
rowMeans(df1[colnames(df1)[!is.na(as.numeric(colnames(df1)))]])
# [1] 4.666667 6.000000 6.666667 2.666667 3.000000 3.666667 5.000000

or using regular expression.

rowMeans(df1[colnames(df1)[grepl("^\\d+$", colnames(df1))]])
# [1] 4.666667 6.000000 6.666667 2.666667 3.000000 3.666667 5.000000

答案 1 :(得分:2)

在@Ven Yao的回答的基础上,使用mutate创建一行rowMeans:

require(dplyr)
df1 <- read.table(text="
TesterType    SubjectType    Time        1     2     3
TType1         SType1          Day1       11    2     1
TType1         SType2          Day1       3     2     13
TType1         SType1          Day2       2     3     15
TType2         SType3          Day2       1     4     3
TType3         SType3          Day2       2     3     4
TType1         SType1          Day1       7     2     2
TType2         SType1          Day2       2     6     7",
                  head=T, as.is=T, check.names=F)

l<-which(!is.na(as.numeric(colnames(df1))))
df1 <- df1 %>%
  mutate(rowmean = apply(select(.,unlist(l)),1,mean))
df1
  TesterType SubjectType Time  1 2  3  rowmean
1     TType1      SType1 Day1 11 2  1 4.666667
2     TType1      SType2 Day1  3 2 13 6.000000
3     TType1      SType1 Day2  2 3 15 6.666667
4     TType2      SType3 Day2  1 4  3 2.666667
5     TType3      SType3 Day2  2 3  4 3.000000
6     TType1      SType1 Day1  7 2  2 3.666667
7     TType2      SType1 Day2  2 6  7 5.000000

答案 2 :(得分:1)

使用以numbers开头的列名称并不好。我们可以将其更改为使用make.names

附加前缀“X”
rowMeans(df1[grep('^X', make.names(names(df1)))])
#[1] 4.666667 6.000000 6.666667 2.666667 3.000000 3.666667 5.000000

或使用dplyr

library(dplyr)
df1 %>% 
    select(matches('^\\d+')) %>%
    Reduce(`+`, .)/3