我的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
)时自动获取?
这样,如果我有更多具有数字列名称的列,我不必更改列范围?
谢谢。
答案 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
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