【问题标题】:how to extract column names based on a condition?如何根据条件提取列名?
【发布时间】:2018-09-12 15:52:04
【问题描述】:

考虑这个简单的例子

mytest <- data_frame(group = c('a', 'a', 'a', 'b', 'b', 'b'),
                     x = c(NA,NA,NA,5,6,7),
                     other_var = c(NA, NA, NA, 1,2,3),
                     y = c(3,5,6,NA,NA,NA),
                     another_var = c(1,2,3, NA,NA,NA),
                     label_x = c('hello','hello','hello','world','world','world'),
                     label_y =c('bada','bada','bada','boom','boom','boom'),
                     label_other_var = c('ak','ak','ak','run','run','run'),
                     label_another_var = c('noo','noo','noo','bie','bie','bie'))

# A tibble: 6 x 9
  group     x other_var     y another_var label_x label_y label_other_var label_another_var
  <chr> <dbl>     <dbl> <dbl>       <dbl> <chr>   <chr>   <chr>           <chr>            
1 a        NA        NA     3           1 hello   bada    ak              noo              
2 a        NA        NA     5           2 hello   bada    ak              noo              
3 a        NA        NA     6           3 hello   bada    ak              noo              
4 b         5         1    NA          NA world   boom    run             bie              
5 b         6         2    NA          NA world   boom    run             bie              
6 b         7         3    NA          NA world   boom    run             bie 

在这里,我需要通过group nest() 这个数据框,并且能够提取不是 NA 的变量的列名(在每个嵌套数据框中)。诀窍是变量的实际名称显示在label_ 列中

例如,这是所需的输出:

# A tibble: 4 x 2
  group var  
  <chr> <chr>
1 a     bada 
2 a     noo  
3 b     world
4 b     run  

确实,组a。只有一个非缺失变量是yanother_var。但是y 的名称是bada(如label_y 变量所示),another_var 的名称是noob 的原因相同。

我不知道如何在运行后调用map 来做到这一点

mytest %>% group_by(group) %>% nest()

# A tibble: 2 x 2
  group data            
  <chr> <list>          
1 a     <tibble [3 x 8]>
2 b     <tibble [3 x 8]>

有什么想法吗? 谢谢!

编辑:最初提出的较小的小标题如下

 mytest <- data_frame(group = c('a', 'a', 'a', 'b', 'b', 'b'),
+                      x = c(NA,NA,NA,5,6,7),
+                      y = c(3,5,6,NA,NA,NA),
+                      label_x = c('hello','hello','hello','world','world','world'),
+                      label_y =c('bada','bada','bada','boom','boom','boom'))

【问题讨论】:

  • 您能否也保留原始数据集并将其作为更新,这样我就不必更改原始答案。将更新答案
  • 好的,我也可以添加旧的

标签: r dplyr purrr


【解决方案1】:

nesting 分组后,通过提取first 非NA 元素、gathermapsummarise 和“标签”列循环遍历“数据”到单个列同时删除NA (na.rm = TRUE))、select 'var' 列,然后执行unnest(仅保留感兴趣的列之后)

mytest %>%
  group_by(group) %>% 
  nest %>% 
  mutate(var = map(data, ~ 
                     .x %>%
                      summarise(label_x = label_x[!is.na(x)][1], 
                                label_y = label_y[!is.na(y)][1]) %>% 
                      gather(key, var, na.rm = TRUE) %>% 
                      select(var))) %>%
  select(-data) %>% 
  unnest
# A tibble: 2 x 2#
#  group var 
#  <chr> <chr>
#1 a     bada 
#2 b     world

更新

如果有更多列,则创建唯一的列名,然后使用map2循环遍历相应的列名

nm1 <- unique(sub("label_", "", setdiff(names(mytest), "group")))
nm2 <- paste0("label_", nm1)
mytest %>% 
   group_by(group) %>% 
   nest %>%
   mutate(var = map(data, ~ 
                    map2_chr(.x %>% 
                               select(nm1),
                             .x %>%
                              select(nm2), ~ 
                                .y[!is.na(.x)][1]) %>% 
                                   na.omit %>%
                                   tibble(var = .))) %>% 
    select(-data) %>%
    unnest
# A tibble: 4 x 2
#  group var  
#  <chr> <chr>
#1 a     bada 
#2 a     noo  
#3 b     world
#4 b     run  

【讨论】:

  • 嗨,akrun,这很好,但我不能一概而论。也就是说,在我的数据框中,有许多不同的变量(具有不同的名称)。但是,label 变量始终具有label_X 的形式,其中X 是给定变量。我正在考虑在这里使用summarize_if,但没有看到清晰的路径……有什么想法吗?谢谢!
  • @ℕʘʘḆḽḘ 我正要问你这个问题。如果你有一个对应的label列,后缀部分作为实际的列名,那么我们可以遍历列名来做
  • 是的,让我创建一个稍微大一点的例子,让循环更有意义。再次感谢!
  • 完成!再次感谢,是的,这在现实生活中实际上很有用:)
  • @ℕʘʘḆḽḘ 更新帖子
【解决方案2】:

这将输出你想要的结果:

mytest <- data_frame(group = c('a', 'a', 'a', 'b', 'b', 'b'),
                     x = c(NA,NA,NA,5,6,7),
                     y = c(3,5,6,NA,NA,NA),
                     label_x = c('hello','hello','hello','world','world','world'),
                     label_y =c('bada','bada','bada','boom','boom','boom'))

extract_good_colnames <- function(df, subgroup){
  subset <- filter(df, group == subgroup)
  if(sum(is.na(subset$x)) > 0){
    colname = 'label_y'
  }else if(sum(is.na(subset$y)) > 0){
    colname = 'label_x'
  }
  return(tibble(group = subgroup, var = as.character(subset[1, colname])))
}

groups <- unique(mytest$group)
map_df(groups, function(x) extract_good_colnames(mytest, x))

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2017-04-09
    • 2020-03-19
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多