首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从分组数据中的不同行创建列

从分组数据中的不同行创建列
EN

Stack Overflow用户
提问于 2021-07-22 02:23:14
回答 3查看 79关注 0票数 1

我需要做一个新的列,以某种方式粘贴数据从cols 2到6(用空格分隔)只用于非NAs(每个组只有一个非NAs条目)。

下面是我的数据的前两组(按"game.event“分组)的dput。在每一行中,所创建的所需列应具有以下内容:

对于组279310中的所有game.event行,对于279315组中的所有游戏事件行,新的col应该返回:" NULL“,新的col应该返回:”淡出肩滚/飞卷“。

最后一件事。这两个组每个组有6行,在大多数情况下这是正常的,但我认为有些game.event组可能有5行。

dput:

代码语言:javascript
代码运行次数:0
运行
复制
    structure(list(game.event = c("279310", "279310", "279310", "279310", 
    "279310", "279310", "279315", "279315", "279315", "279315", "279315", 
    "279315"), L1 = c("NULL", NA, NA, NA, NA, NA, "Fade - Back Shoulder", 
    NA, NA, NA, NA, NA), L2 = c(NA, "NULL", NA, NA, NA, NA, NA, "Curl", 
    NA, NA, NA, NA), R2 = c(NA, NA, NA, "NULL", NA, NA, NA, NA, NA, 
    "Out", NA, NA), R1 = c(NA, NA, "NULL", NA, NA, NA, NA, NA, "Go/Fly", 
    NA, NA, NA), B = c(NA, NA, NA, NA, "NULL", NA, NA, NA, NA, NA, 
    NA, "Curl")), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
    "data.frame"))

dplyr的答案是想要的,但会接受任何有效的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-22 03:21:21

我们可以通过'game.event‘在group_split上循环使用map,在list上使用map循环,在'game.event’以外的列中unlist,删除NAs (na.omit)和paste (str_c -)以在tibble中进行总结,用_dfrmap中绑定list元素。

代码语言:javascript
代码运行次数:0
运行
复制
library(dplyr)
library(purrr)
library(stringr)
df %>% 
   group_split(game.event) %>%
   map_dfr(~ tibble(game.event = first(.x$game.event),
      new = str_c(na.omit(unlist(.x[-1])), collapse= " ")))
# A tibble: 2 x 2
  game.event new                                      
  <chr>      <chr>                                    
1 279310     NULL NULL NULL NULL NULL                 
2 279315     Fade - Back Shoulder Curl Out Go/Fly Curl

或者另一种选择是使用nest_bytransmute,方法是对'data‘列进行unlist,并对非NA元素使用paste

代码语言:javascript
代码运行次数:0
运行
复制
df %>% 
   nest_by(game.event) %>%
   transmute(new = str_c(na.omit(unlist(data)), collapse=" ")) %>% 
   ungroup
# A tibble: 2 x 2
  game.event new                                      
  <chr>      <chr>                                    
1 279310     NULL NULL NULL NULL NULL                 
2 279315     Fade - Back Shoulder Curl Out Go/Fly Curl

更新

如果我们想为只有NA的列添加占位符,我们可以将其中一个元素替换为字符"NA",因此它不会被na.omit删除。

代码语言:javascript
代码运行次数:0
运行
复制
df1 %>% 
    group_by(game.event) %>%
    mutate(across(everything(), ~ if(all(is.na(.))) c("NA", .[-1]) else .)) %>% 
    nest() %>%
    transmute(new = str_c(na.omit(unlist(data)), collapse=" ")) %>% 
    ungroup
# A tibble: 1 x 2
  game.event new                   
  <chr>      <chr>                 
1 2793135    Curl Curl NA Curl NULL

数据

代码语言:javascript
代码运行次数:0
运行
复制
df1 <- structure(list(game.event = c("2793135", "2793135", "2793135", "2793135", "2793135", "2793135"), L1 = c(NA, NA, NA, "Curl", NA, NA), L2 = c(NA, NA, "Curl", NA, NA, NA), R2 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_ ), R1 = c("Curl", NA, NA, NA, NA, NA), B = c(NA, NA, NA, NA, NA, "NULL")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
票数 2
EN

Stack Overflow用户

发布于 2021-07-22 02:41:19

您可以通过pivot_longer获取一列中的所有值,然后删除NAs。

然后按game.event分组,并创建非NA值的空格分隔字符串,并连接到原始的df

代码语言:javascript
代码运行次数:0
运行
复制
library(tidyverse)

df %>% 
  left_join(by = "game.event",
    df %>% 
    pivot_longer(-game.event) %>% 
    filter(!is.na(value)) %>% 
    group_by(game.event) %>% 
    summarise(values = paste(value, collapse = " "))
)

# A tibble: 12 x 7
   game.event L1                   L2    R2    R1     B     values                                   
   <chr>      <chr>                <chr> <chr> <chr>  <chr> <chr>                                    
 1 279310     NULL                 NA    NA    NA     NA    NULL NULL NULL NULL NULL                 
 2 279310     NA                   NULL  NA    NA     NA    NULL NULL NULL NULL NULL                 
 3 279310     NA                   NA    NA    NULL   NA    NULL NULL NULL NULL NULL                 
 4 279310     NA                   NA    NULL  NA     NA    NULL NULL NULL NULL NULL                 
 5 279310     NA                   NA    NA    NA     NULL  NULL NULL NULL NULL NULL                 
 6 279310     NA                   NA    NA    NA     NA    NULL NULL NULL NULL NULL                 
 7 279315     Fade - Back Shoulder NA    NA    NA     NA    Fade - Back Shoulder Curl Go/Fly Out Curl
 8 279315     NA                   Curl  NA    NA     NA    Fade - Back Shoulder Curl Go/Fly Out Curl
 9 279315     NA                   NA    NA    Go/Fly NA    Fade - Back Shoulder Curl Go/Fly Out Curl
10 279315     NA                   NA    Out   NA     NA    Fade - Back Shoulder Curl Go/Fly Out Curl
11 279315     NA                   NA    NA    NA     NA    Fade - Back Shoulder Curl Go/Fly Out Curl
12 279315     NA                   NA    NA    NA     Curl  Fade - Back Shoulder Curl Go/Fly Out Curl

注意:如果您不立即需要新列中的值作为空格分隔的列表,则可以将它们存储为列表,而不是粘贴的空格分隔的字符串。为此,请使用summarise(values = list(value))

票数 1
EN

Stack Overflow用户

发布于 2021-07-22 03:15:47

您可以unlist cur_data()值,删除NA并粘贴每个game.event的输出。

代码语言:javascript
代码运行次数:0
运行
复制
library(dplyr)

df %>%
  group_by(game.event) %>%
  summarise(new = paste(na.omit(unlist(cur_data())), collapse = ' '))

#  game.event new                                      
#  <chr>      <chr>                                    
#1 279310     NULL NULL NULL NULL NULL                 
#2 279315     Fade - Back Shoulder Curl Out Go/Fly Curl

如果您想保持其余的行和列保持原样,并且只想添加一个新列,请使用mutate而不是summarise

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68478402

复制
相关文章

相似问题

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