2017-05-30 68 views
0

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

比如我有数据的前两列,并希望建立在第3列中的布尔数组它是否是一个新的一天,一个新用户:

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 
+2

欢迎[堆栈溢出(http://stackoverflow.com)!在这个网站,你应该尝试**自己编写代码**。在[做更多研究]之后(http://meta.stackoverflow.com/questions/261592),如果你有问题,你可以**发布你已经尝试过**的清单,说明什么是不工作的**并提供一个** [最小,完整和可验证示例](http://stackoverflow.com/help/mcve)**。我建议阅读[如何提出一个好问题](http://stackoverflow.com/questions/how-to-ask)。另外,一定要采取[旅游](http://stackoverflow.com/tour) – AWinkle

回答

0

有可能是一个错字在被设置为最后一排的样本数据是按照给定的标准唯一

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 

更新

如果用户是商店d的因素,然后下面的工作

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 
+0

有没有一种方法,你会适应上面的代码,如果用户ID混合的字母和数字?如果日期差异小于2天,则适应“独特”?我将你的方法应用到我的数据中,第一行得到“1”,然后在剩下的部分得到NA。提前致谢。 – PMo

+0

@PMo更新了答案,以包含以文本和日期范围存储的用户 – manotheshark

0

这可能给你你在找什么

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)) 
+0

完美谢谢,而且我更改了错字顶部,您是正确的 – PMo