Подмножество столбцов age
с friend1
и friend2
в качестве индексов, затем cbind
результирующие векторы.Теперь это простой вызов rowMeans
.
tmp <- with(dat, cbind(age[friend1], age[friend2]))
dat$AvgAgeF <- rowMeans(tmp, na.rm = TRUE)
rm(tmp)
dat
# id age friend1 friend2 AvgAgeF
#1 1 15 2 5 28
#2 2 23 1 5 24
#3 3 51 4 NA 41
#4 4 41 3 NA 51
#5 5 33 1 2 19
Edit.
Если существует неопределенное количество столбцов friend*
, необходимо следовать другой стратегии.
Первый набор данных, начиная с данных вопроса.
set.seed(1234)
tmp <- matrix(sample(c(NA, 1:5), 20, TRUE), nrow = 5)
colnames(tmp) <- paste0("friend", 3:6)
dat <- cbind(dat, tmp)
Теперь используйте grep
, чтобы получить столбцы friend
.
inx <- grep("friend", names(dat))
tmp <- sapply(inx, function(i) dat$age[dat[[i]]])
dat$AvgAgeF <- rowMeans(tmp, na.rm = TRUE)
Окончательная очистка.
rm(tmp)
Редактировать 2 - id
являются символьными строками.
Если столбцы id
и friend*
являются символьными строками вместо числовых, индексный столбец age
с match
.
inx <- grep("friend", names(dat2))
tmp <- sapply(inx, function(i) {
x <- as.character(dat2[[i]])
y <- as.character(dat2$id)
dat2$age[match(x, y)]
})
dat2$AvgAgeF <- rowMeans(tmp, na.rm = TRUE)
rm(tmp)
dat2
# id age friend1 friend2 AvgAgeF
#1 Bob 15 Jack Sam 37
#2 Jack 23 Sam Bob 33
#3 Sam 51 Bob Jack 19
#4 Sara 41 Henry <NA> 33
#5 Henry 33 Sara <NA> 41
Данные.
dat <- read.table(text = "
id age friend1 friend2
01 15 02 05
02 23 01 05
03 51 04 NA
04 41 03 NA
05 33 01 02
", header = TRUE)
dat2 <- read.table(text = "
id age friend1 friend2
Bob 15 Jack Sam
Jack 23 Sam Bob
Sam 51 Bob Jack
Sara 41 Henry NA
Henry 33 Sara NA
", header = TRUE)