我正面临一个问题,我现在已经尝试解决了几天,而我无法绕过它。也许你们都知道一个很好的解决方案。
我有一个数据框,大约有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
值。
我想要的是ACTION
和ACTION_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_n
和PATROL_n
的其他虚拟变量n=1:5
。
我试图通过一些循环来实现这一点,我通过唯一ID对大数据框进行子集化,然后尝试生成新变量并将它们附加到新数据框。但这从来都不一致。如果有人对如何使这项工作有任何想法,我会非常感激!
一切顺利 NIK
答案 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。