【问题标题】:Create New Column If Statement Based on Duplicate Rows in RIf语句基于R中的重复行创建新列
【发布时间】:2017-06-15 02:37:25
【问题描述】:

我想根据它是否是重复行来创建一个新列。我的数据按用户 # 排序,然后是日期。我希望新列检查第一列中的值是否等于前一行,然后对日期执行相同操作。

例如,我有前两列数据,想在第三列创建一个布尔数组,无论它是否是新用户的新用户:

User#   Date     Unique   
1       1/1/17    1 
1       1/1/17    0
1       1/2/17    1
2       1/1/17    1
3       1/1/17    1
3       1/2/17    1

【问题讨论】:

标签: sql r


【解决方案1】:

这可能会给你你正在寻找的东西

library(dplyr)

User <- c(1,1,1,2,3,3)
Date <- c("1/1/17","1/1/17","1/2/17","1/1/17","1/1/17","1/2/17")

df <- data.frame(User,Date,stringsAsFactors = FALSE)

df <- df %>%
       group_by(User, Date) %>%
       mutate(Unique = if_else(duplicated(Date) == FALSE, 1, 0))

【讨论】:

  • 完美,谢谢,是的,我把上面的错字改了,你是对的
【解决方案2】:

样本数据集中可能存在拼写错误,因为根据给定条件,最后一行是唯一的

df1$Unique <- c(1, diff(df1$User) != 0 | diff(df1$Date) != 0)

  User       Date Unique
1    1 2017-01-01      1
2    1 2017-01-01      0
3    1 2017-01-02      1
4    2 2017-01-01      1
5    3 2017-01-01      1
6    3 2017-01-02      1

更新

如果用户被存储为因子,那么以下将起作用

User <- c(1, 1, 1, 2, 3, 3)
User <- letters[User]
Date <- c("1/1/17", "1/1/17", "1/4/17", "1/1/17", "1/1/17", "1/2/17")
df1 <- data.frame(User, Date)
df1$Date <- as.Date(df1$Date, "%m/%d/%y")

df1$Unique <- c(1, diff(as.numeric(df1$User)) != 0 | diff(df1$Date) > 1)

  User       Date Unique
1    a 2017-01-01      1
2    a 2017-01-01      0
3    a 2017-01-04      1
4    b 2017-01-01      1
5    c 2017-01-01      1
6    c 2017-01-02      0

【讨论】:

  • 如果用户 ID 包含字母和数字,有没有办法调整上面的代码?如果日期差小于 2 天,则适应“唯一”?我将您的方法应用于我的数据并在第一行得到一个“1”,然后在剩下的部分得到一个 NA。提前致谢。
  • @PMo 更新了答案以包含存储为文本和日期范围的用户
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多