2015-12-08 4 views
3

У меня есть datafram, который выглядит как:rowMeans, если имя столбца номер

данных у меня есть выглядит как ..

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)?

Так что, если у меня больше столбцов с числовыми именами столбцов, мне не нужно менять диапазоны столбцов?

спасибо.

ответ

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

Неправильно использовать названия столбцов, начинающиеся с numbers. Мы можем изменить его, чтобы добавить префикс 'X', используя make.names

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 
2

Опираясь на ответ @Ven Яо, чтобы создать столбец rowMeans с помощью mutate:

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 
Смежные вопросы