Я хочу получить значения из определенных столбцов. Столбцы различны для каждой строки и зависят от значений из другого столбца. Пример ниже должен говорить сам за себя.

Вот что у меня есть:

id   year   data.2014   data.2015
1    2014   21          22
2    2015   23          24

Вот что я хотел бы иметь:

id   year   data.2014   data.2015   data
1    2014   21          22          21
2    2015   23          24          24

Заранее спасибо!

r
0
lillemets 18 Апр 2016 в 13:39

2 ответа

Лучший ответ

Вы можете векторизовать это, просто добавив data. к df$year и сопоставив его в именах столбцов

indx <- match(paste0("data.", df$year), names(df))
df$data <- df[cbind(1:nrow(df), indx)]
df
#   id year data.2014 data.2015 data
# 1  1 2014        21        22   21
# 2  2 2015        23        24   24

Другой вариант - работать с данными длинного формата, а затем снова присоединиться к исходным данным с помощью id

library(data.table)
indx <- melt(setDT(df), id = 1:2)[variable == paste0("data.", year), .(id, value)]
df[indx, data := i.value, on = "id"]
df
#    id year data.2014 data.2015 data
# 1:  1 2014        21        22   21
# 2:  2 2015        23        24   24
5
David Arenburg 18 Апр 2016 в 11:33

Если ваши столбцы с годами отсортированы таким образом, вы можете сделать что-то вроде:

data <-  data.frame(id=1:2, year=2014:2015, data.2014=c(21,23), data.2015=c(22,24))

tmp <- c()
for (i in 1:nrow(data)){
  tmp <- c(tmp, data[i, 3+data$year[i]-2014])
}
data$test <- tmp
data
1
Yo B. 18 Апр 2016 в 11:17