首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出一个组中的所有列在R中是否都是一致的

找出一个组中的所有列在R中是否都是一致的
EN

Stack Overflow用户
提问于 2020-08-28 11:21:31
回答 1查看 37关注 0票数 1

我有一个数据框架,df

代码语言:javascript
复制
df <- structure(list(ID = structure(c("ID961", "ID961", 
"ID961", "ID961", "ID726", 
"ID726", "ID726", "ID864", 
"ID864", "ID864"), label = "ID"), 
    TYPE = structure(c("blind", "blind", "blind", "blind", 
    "blind", "blind", "blind", "blind", "blind", "notblind"
    ), label = "blind or not"), AGE = structure(c(50, 
    50, 50, 50, 67, 67, 67, 35, 35, 35), label = "Age"), AGEU = structure(c("YEARS", 
    "YEARS", "YEARS", "YEARS", "YEARS", "YEARS", "YEARS", "YEARS", 
    "YEARS", "YEARS"), label = "Age Units"), AVISIT = structure(c("26", 
    "46", "46", "36", "66", 
    "64", "67", "37", "37", 
    "67"), label = "treat")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"), label = "df")

> df
# A tibble: 10 x 5
   ID    TYPE    AGE AGEU  AVISIT
   <chr> <chr> <dbl> <chr> <chr> 
 1 ID961 blind    50 YEARS 26    
 2 ID961 blind    50 YEARS 46    
 3 ID961 blind    50 YEARS 46    
 4 ID961 blind    50 YEARS 36    
 5 ID726 blind    67 YEARS 66    
 6 ID726 blind    67 YEARS 64    
 7 ID726 blind    67 YEARS 67    
 8 ID864 blind    35 YEARS 37    
 9 ID864 blind    35 YEARS 37    
10 ID864 notblind 35 YEARS 67 

对于每个ID,我想知道匹配该ID的每个列条目是否是统一的。

例如:

ID961 - TYPE是一样的,AGE是一样的,AGEU是一样的,但是AVISIT是不一样的。

ID726 - TYPE是一样的,AGE是一样的,AGEU是一样的,但是AVISIT是不一样的。

ID864 - AGE是一样的,AGEU是一样的,但是AVISIT是不一样的,TYPE是不一样的。

因此,我希望返回的是AGEAGEU在ID中都是统一的,例如:

代码语言:javascript
复制
uniform
[1] "AGE"  "AGEU"

我不知道该怎么做-我知道我可以用

代码语言:javascript
复制
match <- df %>% group_by(ID)

但那就不知道怎么继续下去了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-28 11:29:35

也许你能做到:

代码语言:javascript
复制
library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(across(everything(), ~ n_distinct(.x) == 1), .groups = "drop")

# Or deprecated way
df %>%
  group_by(ID) %>%
  summarise_all(~n_distinct(.x) == 1)

# A tibble: 3 x 5
  ID    TYPE  AGE   AGEU  AVISIT
  <chr> <lgl> <lgl> <lgl> <lgl> 
1 ID726 TRUE  TRUE  TRUE  FALSE 
2 ID864 FALSE TRUE  TRUE  FALSE 
3 ID961 TRUE  TRUE  TRUE  FALSE 

如果你想要列名,你可以:

代码语言:javascript
复制
df %>%
  group_by(ID) %>%
  summarise(across(everything(), ~ n_distinct(.x) == 1), .groups = "drop") %>%
  rowwise() %>%
  transmute(ID, uniform = toString(names(.)[which(c_across(cols = -ID)) + 1]))

# Or ...
df %>%
  group_by(ID) %>%
  summarise_all(~n_distinct(.x) == 1)  %>%
  transmute(ID, 
            uniform = pmap_chr(.[-1], ~ toString(names(df)[c(FALSE, ...)])))  

# A tibble: 3 x 2
# Rowwise: 
  ID    uniform        
  <chr> <chr>          
1 ID726 TYPE, AGE, AGEU
2 ID864 AGE, AGEU      
3 ID961 TYPE, AGE, AGEU
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63632808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档