% group_-6ren">
gpt4 book ai didi

r - 将 "missed"数字的数据帧转换为数字 "hit"的数据帧

转载 作者:行者123 更新时间:2023-12-01 10:19:52 25 4
gpt4 key购买 nike

我有一个很具体的疑问,但应该很容易解决,我只是想不出如何...

我有一个像这样的简单数据框:

mydf <- data.frame(Shooter=1:3, Targets.missed=c(paste(sample(1:10,4),collapse=";"), paste(sample(1:10,5),collapse=";"), paste(sample(1:10,8),collapse=";")))
mydf
Shooter Targets.missed
1 1 3;8;4;7
2 2 10;1;5;7;4
3 3 5;9;4;10;8;1;6;7

此数据框告诉我每个 Shooter 错过的 Targets(从 1 到 10)。

我想获得一个不同的数据框,根据 Target 告诉我哪个 Shooter 成功了。

结果是:

Target   hit.by.Shooters
1 1
2 1;2;3
3 2;3
4 NA
5 1
6 1;2
7 NA
8 2
9 1;2
10 1

最佳答案

我们通过将 'Targets.missed' 的 ; 拆分为 'long' 格式来扩展数据,然后按 'Shooter' 分组,summariselist 不在 1:10 的“Targets.missed”中的数字,unnest list 列,按“Target”分组,通过将 unique 'Shooter' 元素粘贴到一个字符串中来总结,并用 NA< 填充从 1:10 开始缺少的元素 通过使用 complete

library(tidyverse)
mydf %>%
separate_rows(Targets.missed) %>%
group_by(Shooter) %>%
summarise(Target = list(setdiff(1:10, Targets.missed))) %>%
unnest %>%
group_by(Target) %>%
summarise(hit.by.Shooters = paste(unique(Shooter), collapse=";")) %>%
complete(Target = 1:10)
# A tibble: 10 x 2
# Target hit.by.Shooters
# <int> <chr>
# 1 1 1
# 2 2 1;2;3
# 3 3 2;3
# 4 4 <NA>
# 5 5 1
# 6 6 1;2
# 7 7 <NA>
# 8 8 2
# 9 9 1;2
#10 10 1

或者另一种选择是 base R 通过将“Targets.missed”(假设 character 类)拆分为 list vector,遍历list,获取不在1:10内的值(使用setdiff),设置list的名称 与 'Shooter' 列,堆叠 key/val list 对成两列 data.frame,得到 unique行,通过粘贴按“values”分组的“ind”列聚合merge与 1:10 的完整“values”数据集

out <-  aggregate(ind ~ values, 
unique(stack(setNames(lapply(strsplit(mydf$Targets.missed, ';'),
setdiff, x= 1:10), mydf$Shooter))), FUN = paste, collapse=";")
out1 <- merge(data.frame(values = 1:10), out, all.x = TRUE)

必要时更改列名

names(out1) <- c('Target', 'hit.by.Shooters')

数据

mydf <- structure(list(Shooter = 1:3, Targets.missed = c("3;8;4;7", "10;1;5;7;4", 
"5;9;4;10;8;1;6;7")), class = "data.frame", row.names = c("1",
"2", "3"))

关于r - 将 "missed"数字的数据帧转换为数字 "hit"的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54018184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com