【问题标题】:Duplication of Rows in data.frame in RR中data.frame中的行重复
【发布时间】:2016-05-03 11:22:27
【问题描述】:

我有一个很大的 data.frame,看起来类似于下面的示例:

  ID date sex grade location
1  1 2000   m     1        x
2  1 2001   m     2        y
3  2 1999   f     3        z
4  2 2000   f     4        f
5  3 2000   m     5        k
6  3 2001   m     6        l

重现它运行:

df <- data.frame(ID=c(1,1,2,2,3,3),
                     date=c(2000,2001,1999,2000,2000,2001),
                     sex = c("m", "m", "f", "f", "m", "m"),
                     grade =c(1,2,3,4,5,6),
                     location =c("x","y","z", "f","k","l") )

我渴望操纵/更改我的 data.frame 以获得以下结构:

      ID date sex grade location
    1  1 1999   m     0        0
    2  1 2000   m     1        x
    3  1 2001   m     2        y
    4  2 1999   f     3        z
    5  2 2000   f     4        f
    6  2 2001   f     0        0
    7  3 1999   m     0        0
    8  3 2000   m     5        k
    9  3 2001   m     6        l

【问题讨论】:

标签: r dataframe duplicates


【解决方案1】:

这可以通过data.table 来完成,如下所示:

library(data.table)
setDT(df, key = c("ID", "date"))

> df[CJ(ID, date, unique = TRUE)]
   ID date sex grade location
1:  1 1999  NA    NA       NA
2:  1 2000   m     1        x
3:  1 2001   m     2        y
4:  2 1999   f     3        z
5:  2 2000   f     4        f
6:  2 2001  NA    NA       NA
7:  3 1999  NA    NA       NA
8:  3 2000   m     5        k
9:  3 2001   m     6        l

如果要在ID内统一sex

df <- df[CJ(ID, date, unique = TRUE)]

df[ , sex := unique(na.omit(sex)), by = ID]

如果你真的想要0s 而不是NA 用于gradelocation(你应该重新考虑这一点,因为最好将其保留为NA):

df[is.na(grade), grade := 0]
levels(df$location) <- c("0", levels(df$location))
df[is.na(location), location := "0"]

【讨论】:

  • 那是相当不错的方式。是否可以保留变量 sex 的值以防止将其更改为 NA
  • @DavidArenburg 整洁。
【解决方案2】:

使用tidyr,我们可以使用complete

library(tidyr)
library(dplyr)
df %>% 
    complete(ID, date)
#    ID  date    sex grade location
#  (dbl) (dbl) (fctr) (dbl)   (fctr)
#1     1  1999     NA    NA       NA
#2     1  2000      m     1        x
#3     1  2001      m     2        y
#4     2  1999      f     3        z
#5     2  2000      f     4        f
#6     2  2001     NA    NA       NA
#7     3  1999     NA    NA       NA
#8     3  2000      m     5        k
#9     3  2001      m     6        l

如果我们需要替换 'sex' 中的 NA 值

df %>% 
    complete(ID, date) %>%
    group_by(ID) %>% 
    mutate(sex= sex[!is.na(sex)][1L])

或者base R 选项是

 merge(expand.grid(lapply(df[1:2], unique)), df, all.x=TRUE)

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多