R 创建新列以标识两列是否相同,但第三列中的值不同
我想在我的数据框中添加一个新列,其中包含true和false值,以告诉我两列是否有重复的值,但第三列是否有不同的值 这是我现在的表格:R 创建新列以标识两列是否相同,但第三列中的值不同,r,R,我想在我的数据框中添加一个新列,其中包含true和false值,以告诉我两列是否有重复的值,但第三列是否有不同的值 这是我现在的表格: | ID | name | age|student| | --- | -----|----|-------| | 1 | Joe |23 | Yes | | 2 | Rayan|13 | Yes | | 3 | Sara |20 | No | | 4 | Rayan|21 | Yes | | 5 | Sara |
| ID | name | age|student|
| --- | -----|----|-------|
| 1 | Joe |23 | Yes |
| 2 | Rayan|13 | Yes |
| 3 | Sara |20 | No |
| 4 | Rayan|21 | Yes |
| 5 | Sara |20 | Yes |
| 6 | Joe |23 | Yes |
我想检查姓名和年龄是否有重复的值,但学生有不同的值。我希望生成的列如下所示:
| ID | name | age|student|satisfy|
| --- | -----|----|-------|-------|
| 1 | Joe |23 | Yes | False |
| 2 | Rayan|13 | Yes | False |
| 3 | Sara |20 | No | False |
| 4 | Rayan|21 | Yes | False |
| 5 | Sara |20 | Yes | True |
| 6 | Joe |23 | Yes | False |
只有Sara满足条件,因为在年龄和姓名中有重复的值,但student有不同的值。我怎样才能在R中做到这一点?也许类似的东西可以帮助您:
df <- data.frame(
id = c(1:6),
name = c("Joe", "Rayan", "Sara", "Rayan", "Sara", "Joe"),
age = c(23, 13, 20, 21, 20, 23),
student = c("Yes", "Yes", "No", "Yes", "Yes", "Yes")
)
(df$satisfy <- duplicated(df[,2:3]) & !(duplicated(df[,2:4])))
[1] FALSE FALSE FALSE FALSE TRUE FALSE
df使用dplyr
library(dplyr)
df %>%
group_by(name, age) %>%
mutate(ind = n_distinct(student) > 1,
student = ind & duplicated(ind), ind = NULL) %>%
ungroup
# A tibble: 6 x 4
# id name age student
# <int> <chr> <dbl> <lgl>
#1 1 Joe 23 FALSE
#2 2 Rayan 13 FALSE
#3 3 Sara 20 FALSE
#4 4 Rayan 21 FALSE
#5 5 Sara 20 TRUE
#6 6 Joe 23 FALSE
库(dplyr)
df%>%
按(姓名、年龄)分组%>%
突变(ind=n_独立(学生)>1,
学生=ind&重复(ind),ind=NULL)%>%
解组
#一个tibble:6x4
#身份证姓名年龄学生
#
#1乔23错
#2 2 Rayan 13假
#3莎拉20错
#4雷恩21假
#5萨拉20真的吗
#6乔23错
这是一个简单而准确的答案。我试图将“从上一个”设置为“真”,所以Sara的两个条目都是真的,但我做不到。有没有办法做到这一点?如果名字足够好,那么我会继续使用(df$satisfyAll%groupby(name,age)%%>%mutate(success=ifelse(n_distinct(student)=2,TRUE,FALSE))%%>%ungroup()
为什么我们需要后续操作?这两个条件都只返回逻辑向量,不知道哪些行属于同一行。您可以通过管道进入后续操作或使用match来提取重复项的名称,但为什么要尝试在一行中执行所有操作。如果我有两个以上的条目,则这不起作用。例如,一旦我添加了另一个条目呃,有莎拉20岁的那一排,结果是另一个是真的。我只想得到其中一个。