Как выбрать из фрейма данных, используя порядок столбцов, хранящихся в другом фрейме данных в R? - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть два фрейма данных с одинаковым количеством строк.Фрагмент

df1 <- data.frame(X1 = c('3', '2', '1'), X2 = c('1,2', '1,3', '1'))
df1
  X1  X2
1  3 1,2
2  2 1,3
3  1   1
df2 <- data.frame(X1_1 = c(3, 2, 1), X1_2 = c(1, 1, 2), X1_3 = c(2, 3, 3), X2_1 = c(1, 1, 1), X2_2 = c(2, 3, 3), X2_3 = c(3, 2, 2))
df2
  X1_1 X1_2 X1_3 X2_1 X2_2 X2_3
1    3    1    2    1    2    3
2    2    1    3    1    3    2
3    1    2    3    1    3    2

df1 хранит номера столбцов df2, из которых мне нужно взять элементы.df1$X1 - это df2$X1_ -й столбец в подмножестве X1_... из df2.df1$X2 - это df2$X2_ -й столбец в подмножестве X2_... из df2 и так далее.Взяв первую строку в моем примере: df$X1 = 3, поэтому мне нужно взять элемент из df2$X1_3 (3-й столбец).Этот элемент равен 2. Затем df1$X2 = 1,2, и мне нужно взять два элемента, первый из df2$X2_1 и второй из df2$X2_2.Это 1 и 2. Все полученные элементы для первой строки мне нужно сохранить как один вектор в первом элементе нужного списка и т. Д. Для каждой строки.

Другими словами, для фрагмента выше мне нуженlist

[[1]]
[1] 2 1 2

[[2]]
[1] 1 1 2

[[3]]
[1] 1 1

df1 состоит из символьных переменных.

Как создать этот список элементов в R?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Вот один из вариантов.gathertidyr 1.0.0 - pivot_longer будет замена) формата 'df1' на 'long', затем разделите столбец 'val' на , с separate_rows и создайте строку / столбециндекс для извлечения элементов из 'df2' и split по номеру строки ('rn')

library(dplyr)
library(tidyr)
library(tibble)
d1 <- df1 %>% 
       rownames_to_column('rn') %>%
       gather(key, val, -rn) %>%
       #pivot_longer(-rn, names_to= "key", values_to = "val") %>%
       separate_rows(val) %>%
       unite(key, key, val)
split(df2[cbind(as.numeric(d1$rn), match(d1$key, names(df2)))], d1$rn)
#$`1`
#[1] 2 1 2

#$`2`
#[1] 1 1 2

#$`3`
#[1] 1 1
2 голосов
/ 30 сентября 2019

В base вы можете сначала разделить df1$X2, а затем поднастроить, создав имена столбцов, используя paste, например:

tt  <- strsplit(as.character(df1$X2), ",")
lapply(seq_len(nrow(df1)), function(i) {
  x  <- paste0("X",1:2)
  df2[i,c(paste0(x[1], "_", strsplit(df1[i,x[1]], ",")[[1]]), paste0(x[2], "_", strsplit(df1[i,x[2]], ",")[[1]]))]
})
#[[1]]
#  X1_3 X2_1 X2_2
#1    2    1    2
#
#[[2]]
#  X1_2 X2_1 X2_3
#2    1    1    2
#
#[[3]]
#  X1_1 X2_1
#3    1    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...