Установите значение вектора, используя фрейм данных как пару «ключ», «значение» - PullRequest
2 голосов
/ 30 марта 2011

У меня есть два кадра данных DF1, DF2 каждый с двумя векторами DF1 $ A DF1 $ B, DF2 $ C, DF3 $ D. Мне нужно развернуть каждую строку в DF1, и если значение в DF1 $ B равно некоторому значению в DF2 $ C, мне нужно показать соответствующее значение в DF2 $ D.

Я пытался решить эту проблему, используя ifelse и% в%, но безуспешно. Я не понимаю, почему это не работает.

У меня есть:

DataFrame1 (DF1)
A   B   
10  2
11  1
13  3
15  5
25  2
45  4

DataFrameB (DF2)
C D
1 A
2 B
3 C
4 D
5 E
6 F

Что я делаю:

 DF1 <- data.frame(c(10, 11, 13, 15, 25, 45), c(2, 1, 3, 5, 2, 4))
 DF2 <- data.frame( c(1, 2,3,4,5,6), c("A", "B", "C", "D", "E", "F"))
 names(DF1) <-c("A","B")
 names(DF2) <-c("C", "D")
 ifelse((DF1$B %in% DF2$C), DF2$D, "NA")

Что я получаю:

[1] 1 2 3 4 5 6

Что я ожидал получить:

[1] B A C E B D

Как мне этого добиться?

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

Я думаю, что вы действительно хотите, это match ():

DF2$D[match(DF1$B, DF2$C)]
[1] B A C E B D
Levels: A B C D E F

Чтобы упростить присвоение имен столбцам, вы можете сделать это при создании data.frame.Также для получения символов вместо фактора используйте stringsAsFactors:

DF1 <- data.frame(A = c(10, 11, 13, 15, 25, 45), B = c(2, 1, 3, 5, 2, 4))
DF2 <- data.frame(C = c(1, 2,3,4,5,6), D = c("A", "B", "C", "D", "E", "F"), stringsAsFactors = FALSE)

DF2$D[match(DF1$B, DF2$C)]

[1] "B" "A" "C" "E" "B" "D"
4 голосов
/ 30 марта 2011

Я думаю, вам нужно использовать match(), чтобы получить индексы DF1$B в DF2$C, а затем использовать это для индекса DF2$D:

DF2$D[match(DF1$B,DF2$C)]
[1] B A C E B D
Levels: A B C D E F

Это то, что вы имеете в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...