R: строки подмножества кадра данных, содержащего строку в другом файле
Я хотел бы подмножество строк данных кадра 1 (df1
) которые содержат строку из столбца во фрейме данных 2 (df2
). Проблема в том, что file1 будет иметь несколько строк в одном столбце. Я пробовал несколько вариантов подмножества и 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 ответ
Я не уверен, как по теме это здесь, но вы могли бы легко получить свой первый желаемый результат, комбинируя значения в первом столбце 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))