我需要做一个新的列,以某种方式粘贴数据从cols 2到6(用空格分隔)只用于非NAs(每个组只有一个非NAs条目)。
下面是我的数据的前两组(按"game.event“分组)的dput。在每一行中,所创建的所需列应具有以下内容:
对于组279310中的所有game.event行,对于279315组中的所有游戏事件行,新的col应该返回:" NULL“,新的col应该返回:”淡出肩滚/飞卷“。
最后一件事。这两个组每个组有6行,在大多数情况下这是正常的,但我认为有些game.event组可能有5行。
dput:
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的答案是想要的,但会接受任何有效的!
发布于 2021-07-21 19:21:21
我们可以通过'game.event‘在group_split
上循环使用map
,在list
上使用map
循环,在'game.event’以外的列中unlist
,删除NA
s (na.omit
)和paste
(str_c
-)以在tibble
中进行总结,用_dfr
在map
中绑定list
元素。
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_by
和transmute
,方法是对'data‘列进行unlist
,并对非NA元素使用paste
。
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
删除。
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
数据
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"))
发布于 2021-07-21 18:41:19
您可以通过pivot_longer
获取一列中的所有值,然后删除NAs。
然后按game.event
分组,并创建非NA值的空格分隔字符串,并连接到原始的df
。
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))
发布于 2021-07-21 19:15:47
您可以unlist
cur_data()
值,删除NA
并粘贴每个game.event
的输出。
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
。
https://stackoverflow.com/questions/68478402
复制相似问题