R - 按唯一ID和&amp ;;折叠data.frame。生成多个虚拟变量

时间:2017-11-06 22:17:37

标签: r dataframe

我正面临一个问题,我现在已经尝试解决了几天,而我无法绕过它。也许你们都知道一个很好的解决方案。

我有一个数据框,大约有3,000,000行。 有一个关键的ID变量,大约有200,000行。我想将data.frame折叠为一个新的data.frame,每个唯一的ID变量值只有一行。

此外,当ID是重复时,有一堆变量也是重复的。这是一个例子:

ID    NAME   CAR
42    Bob    Ford
42    Bob    Ford
42    Bob    Ford

但是,还有一些变量因数据框的子集而异,表示特定事件或采取的操作。这是一个例子:

ID    NAME   CAR     ACTION    ACTION_ID
42    Bob    Ford    REFILL    4201
42    Bob    Ford    DELIVER   4202
42    Bob    Ford    REFILL    4203

我想要的是将其展平为1行,但使用新的虚拟变量。假设ACTION ENTIRE 原始data.frame中有5个感兴趣的值REFILL, DELIVER, PARK, PICKUP, PATROL。此外,ACTION_ID变量仅与整体ID相关,对于每个给定的ID变量,最大数量为 5 唯一ACTION_ID值。

我想要的是ACTIONACTION_ID的每种可能组合的虚拟变量,它们看起来像这样

ID    NAME   CAR     REFILL_01    REFILL_02    REFILL_03    REFILL_04    REFILL_05
42    Bob    Ford    TRUE         FALSE        TRUE         NA               NA

DELIVER_01    DELIVER_02    DELIVER_03    DELIVER_04    DELIVER_05
FALSE         TRUE          FALSE         NA            NA

PARK_n, PICKUP_nPATROL_n的其他虚拟变量n=1:5

我试图通过一些循环来实现这一点,我通过唯一ID对大数据框进行子集化,然后尝试生成新变量并将它们附加到新数据框。但这从来都不一致。如果有人对如何使这项工作有任何想法,我会非常感激!

一切顺利 NIK

1 个答案:

答案 0 :(得分:0)

我能够做到这一点。您需要手动编写附加代码,但这将为您解决。我假设您的数据框命名为" df"

library(dplyr)    
new <- df %>% group_by(ID,NAME) %>% mutate(REFILL_01 =
 ifelse(ACTION=="Refill" & substr(ACTION_ID,4,4) == 1,"TRUE","FALSE"),
 REFILL_02 = ifelse(ACTION=="Refill" & substr(ACTION_ID,4,4) == 2, "TRUE","FALSE"))

这将获取数据,按ID分组,然后是NAME。然后我们开始制作虚拟变量。我将引导您完成第一个。如果ACTION = Refill且ACTION_ID的结束编号为1,则REFILL_01等于TRUE。否则,它将返回false。如果这有意义,或者您需要进一步澄清,请告诉我。您只需要添加您想要的其他虚拟变量。我为你做了REFILL_01和REFILL_02。