1

Я хотел бы поднастроить строки кадра данных 1 (df1), которые содержат строку из столбца в кадре данных 2 (df2). Проблема в том, что file1 будет иметь несколько строк в одном столбце. Я попробовал несколько вариантов subset и grep , но безуспешно.
Вот пример файлов, и результаты, которые я хотел бы получить (было бы хорошо):

df1

1   apple   A,C,D,F  
2   pear    A,D  
3   plum    B,F  
4   banana  K,P,Z  
5   orange  B,C,D,H  

df2

A   Jan  
B   Feb  
C   Mar  
D   Apr  
E   May  
F   Jun  
G   Jul  
H   Aug  
I   Sept  
J   Oct  

Результат 1

1   apple   A,C,D,F  
2   pear    A,D  
3   plum    B,F  
5   orange  B,C,D,H  

Результат 2

1   apple   A,C,D,F Jan,Mar,Apr,Jun  
2   pear    A,D Jan,Apr  
3   plum    B,F Feb,Jun  
5   orange  B,C,D,H Feb,Mar,Apr,Aug  

1 ответ1

0

Я не уверен, как по теме это здесь, но вы могли бы легко получить свой первый желаемый результат, комбинируя значения в первом столбце df2 с | а затем с помощью grep найти любой из них во втором столбце df1

df1[grep(paste(df2$V1, collapse = "|"), df1$V2), ]
#       V1      V2
# 1  apple A,C,D,F
# 2   pear     A,D
# 3   plum     B,F
# 5 orange B,C,D,H

Для вашего второго вывода, немного больше работы должно быть сделано. Мы могли бы заменить все , на | во второй переменной df1 , а затем искать их в df2 в то время как рушится , и конкатенации обратно df1 некоторые , как следующее

res <- sapply(df1$V2, function(x) {
  res <- df2$V2[grep(gsub("\\,", "|", x), df2$V1)]
  if(length(res)) paste(x, paste(res, collapse = ",")) else NA
  })

cbind.data.frame(V1 = df1[which(!is.na(res)), 1], V2 = na.omit(res))
#       V1                      V2
# 1  apple A,C,D,F Jan,Mar,Apr,Jun
# 2   pear             A,D Jan,Apr
# 3   plum             B,F Feb,Jun
# 4 orange B,C,D,H Feb,Mar,Apr,Aug

Наборы данных, как я их прочитал

df1 <- "banana", "orange", "pear", "plum"), class = "factor"), V2 = structure(c(1L, 
2L, 4L, 5L, 3L), .Label = c("A,C,D,F", "A,D", "B,C,D,H", "B,F", 
"K,P,Z"), class = "factor")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(V1 = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), V2 = structure(c(4L, 
3L, 7L, 1L, 8L, 6L, 5L, 2L, 10L, 9L), .Label = c("Apr", "Aug", 
"Feb", "Jan", "Jul", "Jun", "Mar", "May", "Oct", "Sept"), class = "factor")), .Names = c("V1", 
"V2"), class = "data.frame", row.names = c(NA, -10L))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .