R: Как сделать быструю замену в R? - PullRequest
0 голосов
/ 01 июля 2011

У меня есть такой входной фрейм данных (реальный очень большой, поэтому я хочу сделать это быстрее):

df1 <- data.frame(A=c(1:5), B=c(5:9), C=c(9:13))

  A B  C
1 1 5  9
2 2 6 10
3 3 7 11
4 4 8 12
5 5 9 13

У меня есть фрейм данных с таким кодом замены (записи здесь могут бытьбольше чем df1):

df2 <- data.frame(X=c(1:15), Y=c(101:115))

    X   Y
1   1 101
2   2 102
3   3 103
4   4 104
5   5 105
6   6 106
7   7 107
8   8 108
9   9 109
10 10 110
11 11 111
12 12 112
13 13 113
14 14 114
15 15 115

Сопоставляя df2 $ X со значением в df1 $ A и df1 $ B, я хочу получить new_df1, заменив df1 $ A и df1 $ B соответствующими значениями вdf2 $ Y, то есть, получая это new_df1

  A    B    C
1 101  105  9
2 102  106 10
3 103  107 11
4 104  108 12
5 105  109 13

Не могли бы вы дать мне несколько советов, как сделать это быстрее в R, так как мой фрейм данных очень большой?Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Как упоминал Тило, Нико предполагает, что df2 упорядочено по X и X содержит каждое целое число 1,2,3 ....

Я бы предпочел использовать match() в качестве более общего случая:

df1 <- data.frame(A=c(1:5), B=c(5:9), C=c(9:13))
df2 <- data.frame(X=c(1:15), Y=c(101:115))

new_df1 <- df1

new_df1$A <- df2$Y[match(df1$A,df2$X)]
new_df1$B <- df2$Y[match(df1$B,df2$X)]
    A   B  C
1 101 105  9
2 102 106 10
3 103 107 11
4 104 108 12
5 105 109 13
1 голос
/ 01 июля 2011

Вот другой (однострочный) способ сделать это.

> with(c(df2,df1),data.frame(A = Y[match(A,X)],B = Y[match(B,X)],C))
    A   B  C
1 101 105  9
2 102 106 10
3 103 107 11
4 104 108 12
5 105 109 13

Однако я не уверен, будет ли это быстрее, чем другие предложения

1 голос
/ 01 июля 2011

Это супер-просто!Вам просто нужно получить правильные смещения в массиве.

Так, например, чтобы получить столбец Y df2, соответствующий значениям в столбце A df1, вы напишите df2$Y[df1$A]

Следовательно, ваш код будет:

df_new <- data.frame("A" = df2$Y[df1$A], "B" = df2$Y[df1$B], "C" = df1$C)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...