R:基于现有数据帧上的多个条件创建新数据帧

R:基于现有数据帧上的多个条件创建新数据帧,r,dataframe,dplyr,R,Dataframe,Dplyr,我需要在现有数据帧上使用多个条件创建一个新的数据帧 我尝试使用dplyr函数,特别是针对多个条件进行总结,但失败了,因为一旦应用了条件,数据集大小就会减小 为了便于解释,下面是我试图实现的一个简单示例 df <- data.frame(User = c("Newton","Newton","Newton","Newton","Newton"), Location = c("A","A","B","A","B"), Move

我需要在现有数据帧上使用多个条件创建一个新的数据帧

我尝试使用dplyr函数,特别是针对多个条件进行总结,但失败了,因为一旦应用了条件,数据集大小就会减小

为了便于解释,下面是我试图实现的一个简单示例

df <- data.frame(User = c("Newton","Newton","Newton","Newton","Newton"),
                 Location = c("A","A","B","A","B"),
                 Movement = c(10,10,20,20,30),
                 Unit = c(-2,2,2,-2,-1),
                 Time = c("4-20-2019","4-20-2019","4-21-2019","4-21-2019"
                          ,"4-23-2019"))

dfNew <- data.frame(User = c("Newton","Newton","Newton"),
                    FromLocation = c("A","A","B"),
                    ToLocation = c("A","B","B"),
                    Movement = c(10,20,30),
                    Units = c(2,2,-1))

df听起来像是
dplyr::group_by
case_当
可能就足够了,但我不确定这些是对您的表的“规则”的正确解释

library(dplyr)
df %>%
  group_by(User) %>%
  mutate(FromLocation = case_when(Movement == 10 & Unit < 0 ~  "DROP",
                                  Movement == 10 & Unit > 0 ~  Location,
                                  Movement == 20 & Unit < 0 ~  lag(Location),
                                  Movement == 20 & Unit > 0 ~  lead(Location),
                                  Movement == 30  ~ "B",
                                  TRUE   ~ "not specified in rules"),

         ToLocation = case_when(Movement == 10 & Unit < 0 ~  "DROP",
                                Movement == 10 & Unit > 0 ~  Location,
                                Movement == 20 & Unit < 0 ~  lag(Location), # Not given 
                                Movement == 20 & Unit > 0 ~  Location,
                                Movement == 30  ~ "B",
                                TRUE   ~ "not specified in rules")) %>%
  ungroup() %>%
  filter(FromLocation != "DROP") %>%
  select(User, FromLocation, ToLocation, Movement, Unit)
库(dplyr)
df%>%
分组依据(用户)%>%
变异(当(移动=10且单位<0~“下降”,
移动==10且单位>0~位置,
移动==20且单位<0~滞后(位置),
移动==20且单位>0~领先(位置),
移动==30~“B”,
TRUE~“未在规则中指定”),
ToLocation=case_(移动=10且单位<0~“下降”,
移动==10且单位>0~位置,
移动==20且单位<0~滞后(位置),#未给出
移动==20且单位>0~位置,
移动==30~“B”,
TRUE ~“未在规则中指定”))%%>%
解组()%>%
过滤器(FromLocation!=“DROP”)%>%
选择(用户、从位置、到位置、移动、单位)
结果

# A tibble: 4 x 5
  User   FromLocation ToLocation Movement  Unit
  <chr>  <chr>        <chr>         <dbl> <dbl>
1 Newton A            A                10     2
2 Newton A            B                20     2
3 Newton B            B                20    -2
4 Newton B            B                30    -1
#一个tible:4 x 5
用户从位置到位置移动单元
1牛顿A 10 2
牛顿A B 20 2
3牛顿B 20-2
4牛顿B 30-1

谢谢,@Jon Spring。这就成功了!在这种程度上使用dplyr为我打开了更多的可能性