【问题标题】:dplyr returns data frame that won't rbind to comparable data framedplyr 返回不会绑定到可比较数据帧的数据帧
【发布时间】:2019-10-11 11:14:55
【问题描述】:

我意识到这里有其他方法可以得到结果,但我试图理解为什么在以下代码中使用 rbind 会产生一个列表,而不是一个数据帧,尽管输入了两个明显相同的数据帧.大概与 dplyr 在 group_by 操作后返回的数据框对象有关,但是如何解决呢?

目的是删除 EventCode = X 的重复项(在 EventValue1 和 EventValue2 列上),但保留 EventCode = Y 的重复项。

df <- data.frame(EventID = c("1", "2", "3", "4", "5", "6", "7", "8", "9"),
                 EventValue1 = c("A", "A", "B", "C", "D", "E", "E", "F", "F"),
                 EventValue2 = c("AA", "AA", "BB", "CC", "DD", "EE", "FF", "FF", "FF"),
                 EventCode = c("X", "X", "X", "X", "X", "X", "X", "Y", "Y"))

# split df by event code
df.x <- subset(df, EventCode == "X")
df.y <- subset(df, EventCode == "Y") 

# remove duplicates in df.x by EventValue1 and EventValue2 
df.x.2 <- df.x %>% 
  group_by(EventValue1, EventValue2) %>%
  slice(which.min(EventID))

# recombine dfs
df <- rbind(df.x.2, df.y) # this returns a list, should be a data frame


# desired outcome

# EventID EventValue1 EventValue2 EventCode 
# 1       A           AA          X
# 3       B           AA          X
# 4       C           AA          X
# 5       D           AA          X
# 6       E           AA          X
# 7       E           AA          X
# 8       F           FF          Y
# 9       F           FF          Y



【问题讨论】:

  • 你需要ungroup数据rbind(df.x.2 %&gt;% ungroup(), df.y)
  • 就是这样。谢谢!
  • 自从发现了这个有用的讨论,它解决了何时取消community.rstudio.com/t/…的问题

标签: r dplyr rbind


【解决方案1】:

由于您的df.x.2EventValue1EventValue2 分组,因此rbind 失败。如果你 ungroup 数据,它就可以工作

library(dplyr)
rbind(df.x.2 %>% ungroup(), df.y)

#  EventID EventValue1 EventValue2 EventCode
#* <fct>   <fct>       <fct>       <fct>    
#1 1       A           AA          X        
#2 3       B           BB          X        
#3 4       C           CC          X        
#4 5       D           DD          X        
#5 6       E           EE          X        
#6 7       E           FF          X        
#7 8       F           FF          Y        
#8 9       F           FF          Y        

或使用dplyr 特定的bind_rows 仍将保持分组

bind_rows(df.x.2, df.y)

【讨论】:

  • 请注意,bind_rows 也适用于数据帧具有不同列的情况,方法是附加与 rbind 不同的附加变量。与更严格的 rbind 不同,这可能很有用或会产生不需要的错误。
【解决方案2】:

使用bind_rows 代替rbind

df <- bind_rows(df.x.2, df.y)
df

# A tibble: 8 x 4
# Groups:   EventValue1, EventValue2 [7]
  EventID EventValue1 EventValue2 EventCode
  <fct>   <fct>       <fct>       <fct>    
1 1       A           AA          X        
2 3       B           BB          X        
3 4       C           CC          X        
4 5       D           DD          X        
5 6       E           EE          X        
6 7       E           FF          X        
7 8       F           FF          Y        
8 9       F           FF          Y 

【讨论】:

    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 2021-07-25
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2021-12-14
    • 2019-07-21
    相关资源
    最近更新 更多