поиск строки в именах столбцов и получение соответствующего значения для каждой строки - PullRequest
0 голосов
/ 04 мая 2018

У меня есть df, как это:

id <- c("defoo","ghfoo","abfoo")
abc <- c(.3,.1,.4)
ghi <- c(.4,.2,.2)
abc_dif <- c(.4,.3,.8)
def_dif <- c(.5,.7,.6)
ghi_dif <- c(.2,.1,.9)
df <- data.frame(id,abc,ghi,abc_dif,def_dif,ghi_dif)

Я хочу найти столбцы, имена которых содержат первые два символа значения в строке идентификатора, а также включить «dif», и создать новый столбец, содержащий соответствующие значения в этих столбцах для каждой строки.

В этом примере данных новый столбец будет

df$result <- c(.5,.1,.8)

Мои многочисленные попытки включали различные версии sapply и apply, как, например, следующая попытка просто получить индекс столбца:

df$result <- apply(substr(df[,which(colnames(df)=="id")],1,2),1,function(x) grep(x,colnames(df[which(grepl("dif",colnames(df),fixed=TRUE))]),fixed = TRUE))

Это дает ошибку:

"Error in apply(substr(df[, which(colnames(df) == "id")], 1, 2), 1, function(x) grep(x,  : 
  dim(X) must have a positive length"

Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Можно попробовать tidyverse

library(tidyverse)

df %>% 
  gather(k,v, -id:-ghi) %>% 
  filter(str_sub(id,1,2) == str_sub(k,1,2)) %>% 
  select(1,result=v) %>% 
  left_join(df, .)
     id abc ghi abc_dif def_dif ghi_dif result
1 defoo 0.3 0.4     0.4     0.5     0.2 0.5
2 ghfoo 0.1 0.2     0.3     0.7     0.1 0.1
3 abfoo 0.4 0.2     0.8     0.6     0.9 0.8
0 голосов
/ 04 мая 2018

Вы можете просмотреть df$id, а затем для каждой из них выбрать соответствующую ячейку в df:

df$result <- sapply(df$id, function(x) df[df$id == x,
                                          grepl(paste0(substring(x,1,2),".*dif"), names(df))])

df$result
#[1] 0.5 0.1 0.8
0 голосов
/ 04 мая 2018

Мы могли бы создать row/column индекс, чтобы получить значения

df$result <- df[4:6][cbind(1:nrow(df), match( substr(df$id, 1, 2),
                substr(names(df)[4:6], 1, 2)))]

df$result
#[1] 0.5 0.1 0.8
...