gpt4 book ai didi

r - 合并列,同时忽略重复项和 NA

转载 作者:行者123 更新时间:2023-12-01 22:17:22 28 4
gpt4 key购买 nike

我有一个数据框如下,我想合并两列,即 Var1Var2 。我希望组合列 ( Var3 ) 不包含 <alpha><digit> 的重复项。即如果 Var1 == A1Var2 == A1 ,因此Var3 == A1但不是Var3 == A1-A1或者如果Var1 == A4-E9Var2 == A4 ,因此Var3 == A4-E9但不是Var3 == A4-E9-A4

df <- read.table(header = TRUE, text = 
"id Var1 Var2
A A1 A1
B F2 A2
C NA A3
D A4-E9 A4
E E5 A5
F NA NA
G B2-R4 A3-B2
H B3-B4 E1-G5", stringsAsFactors = FALSE)

以下是我的代码。我想提高它的可读性并摆脱 NA出现在第 3 行的 Var3 条目中,即A3-NA .

library(dplyr)
library(tidyr)
df %>%
mutate(Var3 = paste(Var1, Var2, sep = "-")) %>%
separate_rows(Var3, sep = "-") %>%
group_by(id, Var3) %>%
slice(1) %>%
group_by(id) %>%
mutate(Var3 = paste(unlist(Var3[!is.na(Var3)]), collapse = "-")) %>%
slice(1) %>%
ungroup

这是我想要的输出:

# A tibble: 8 x 4
id Var1 Var2 Var3
<chr> <chr> <chr> <chr>
1 A A1 A1 A1
2 B F2 A2 A2-F2
3 C <NA> A3 A3
4 D A4-E9 A4 A4-E9
5 E E5 A5 A5-E5
6 F <NA> <NA> <NA>
7 G B2-R4 A3-B2 A3-B2-R4
8 H B3-B4 E1-G5 B3-B4-E1-G5

最佳答案

如果输出为“df1”,则我们删除 - 后面带有 sub 的“NA”

df1 %>% 
mutate(Var3 = sub("-NA", "", Var3))
# A tibble: 8 x 4
# id Var1 Var2 Var3
# <chr> <chr> <chr> <chr>
#1 A A1 A1 A1
#2 B F2 A2 A2-F2
#3 C <NA> A3 A3
#4 D A4-E9 A4 A4-E9
#5 E E5 A5 A5-E5
#6 F <NA> <NA> NA
#7 G B2-R4 A3-B2 A3-B2-R4
#8 H B3-B4 E1-G5 B3-B4-E1-G5
<小时/>

我们还可以使用 tidyverse 稍微不同地执行此操作,将 gather 转换为“long”格式,然后使用 separate_rows 拆分“value”列,按“id”分组,通过粘贴排序唯一元素来总结“Var3”列'Var3' 和 left_join 与原始数据集 'df'

library(tidyverse)
gather(df, key, value, -id) %>%
separate_rows(value) %>%
group_by(id) %>%
summarise(Var3 = paste(sort(unique(value)), collapse='-')) %>%
mutate(Var3 = replace(Var3, Var3=='', NA)) %>%
left_join(df, .)
# id Var1 Var2 Var3
#1 A A1 A1 A1
#2 B F2 A2 A2-F2
#3 C <NA> A3 A3
#4 D A4-E9 A4 A4-E9
#5 E E5 A5 A5-E5
#6 F <NA> <NA> <NA>
#7 G B2-R4 A3-B2 A3-B2-R4
#8 H B3-B4 E1-G5 B3-B4-E1-G5

注意:%>% 甚至可以让一个简单的代码出现在多行中,但如果需要,我们可以将所有这些语句放在一行中,并将术语作为 one-liner

<小时/>

这里是一句台词

library(data.table)
setDT(df)[, Var3 := paste(sort(unique(unlist(strsplit(unlist(.SD),"-")))), collapse="-"), id]

关于r - 合并列,同时忽略重复项和 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45137867/

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