gpt4 book ai didi

r - 如何在使用 R 保持原始行顺序的同时按行提取唯一记录和双记录?

转载 作者:行者123 更新时间:2023-12-04 11:59:02 24 4
gpt4 key购买 nike

原创(见下方更新)

我是 R 的新手,目前正在处理边缘列表形式的协作数据,其中包含 32 列和大约 200.000 行,如下所示:

1  A    A    A    B    C    A
2 A B B B C A
3 A B C C C C
4 B A B A B C

A、B、C 代表出版物中参与研究机构的国家。 在真实数据集中“A”是例如国家名称,例如“英国”或“中国”。

我想保留唯一记录 (A) 和双记录 (A A),但删除三元组 (A A A) 以及同一记录在同一行中出现的更多次数。协作按 ID 分配给出版物,因此顺序应保持不变,以便以后进行分析。但是,行内的顺序无关紧要。

所以,它最终应该是这样的。

1  A   A    B    C    
2 A B B C A
3 A B C C
4 B A B A C

到目前为止,我已经尝试了一些基于 1 的东西, 2 , 3triplicated 来自 tuple package .

df <- data.frame(CTR1 = c("A", "A", "A", "B"), CTR2 = c("A", "B", "B", "A"), CTR3 = c("A", "B", "B", "A"), CTR4 = c("B", "B", "C", "A"), CTR5 = c("C", "C", "C", "B"), CTR6 = c("A", "A", "C", "C"), ID = c(1,2,3,4))

# remember the ID

n <-df$ID

# transpose df (data frame)

dt <- as.data.frame(t(df[, -1]))
colnames(dt) <- n

library(tuple)

dt[!(triplicated(dt) | triplicated(dt, fromLast= TRUE)), ]

# Create new transposed variable

df2 <- as.data.frame(t(df))

但是,我使用 dt[!(triplicated(dt) | triplicated(dt, fromLast= TRUE)), ] 删除了完整的行,而不是仅仅删除出现盈余的特定记录排是什么导致我到以下 4x4 表 ...

   CTR1 CTR3 CTR4 CTR5                   CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
1 A A B C 1 A A B C
2 A B B C rather than 2 A B B C A
3 A B C C 3 A B C C
4 B A A B 4 B A B A C

我还查看了 dplyr 和响应 herehere但到目前为止还没有找到合适的方法。

原始问题描述的工作解决方案

library(tidyr)
library(dplyr)

countrydf %>%
unite(concat,CTR1:CTR6, sep = "") %>%
mutate(concat = gsub("([a-zA-Z1-9])\\1{2,}", "\\1\\1-", concat)) %>%
separate(concat, paste0("CTR", 1:6), sep = "(?<=.)", remove = TRUE)

Edit1:为澄清而调整的描述:在真实数据集中,“A”例如国家名称,例如“英国”或“中国”。

Edit2:添加更准确的可重现示例。

更新

添加了一个更准确的可重现示例,合并了原始问题描述的正确答案(见下文):

countrydf <- data.frame(ID = c(1,2,3,4), 
CTR1 = c("England", "England", "England", "China"),
CTR2 = c("England", "China", "China", "England"),
CTR3 = c("England", "China", "China", "England"),
CTR4 = c("China", "China", "USA", "England"),
CTR5 = c("USA", "USA", "USA", "China"),
CTR6 = c("England", "England", "USA", "USA"))

期望的结果

     CTR1    CTR2    CTR3   CTR4  CTR5  CTR6      ID
1 England England China USA 1
2 England China China USA England 2
3 England China China USA USA 3
4 China England England China USA 4

最佳答案

我们可以使用tidyr 函数(uniteseparate)并借助达到预期的输出。

这应该非常接近您的需要。

library(tidyr)
library(dplyr)

df1 %>%
unite(concat,CTR1:CTR6, sep = "") %>%
mutate(concat = gsub("([a-zA-Z1-9])\\1{2,}", "\\1\\1-", concat)) %>%
separate(concat, paste0("CTR", 1:6), sep = "(?<=.)", remove = TRUE)

#> ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
#> 1 1 A A - B C A
#> 2 2 A B B - C A
#> 3 3 A B B C C -
#> 4 4 B A A - B C

更新:

感谢@IceCreamToucan对于函数:

library(tidyr)
library(dplyr)

ICT_fn <- function(x){
xsplit <- strsplit(x, '')[[1]]
xsplit[data.table::rowid(xsplit) >= 3] <- '-'
paste(xsplit, collapse = '')}

df1 %>%
unite(concat,CTR1:CTR6, sep = "") %>%
rowwise() %>%
mutate(concat = ICT_fn(concat)) %>%
separate(concat, paste0("CTR", 1:6), sep = "(?<=.)", remove = TRUE)

#> # A tibble: 4 x 7
#> ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
#> <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1 A A - B C -
#> 2 2 A B B - C A
#> 3 3 A B B C C -
#> 4 4 B A A - B C

这个更新后的解决方案,经过最少的调整,也适用于国家名称;看下面:

df2 <- data.frame(ID = c(1,2,3,4),
CTR1 = c("England", "England", "England", "France"),
CTR2 = c("England", "France", "France", "England"),
CTR3 = c("England", "France", "France", "England"),
CTR4 = c("France", "France", "Germany", "England"),
CTR5 = c("Germany", "Germany", "Germany", "France"),
CTR6 = c("England", "England", "Germany", "Germany"))
library(tidyr)
library(dplyr)

ICT_fn <- function(x){ #Credits to IceCreamToucan
xsplit <- strsplit(x, ',')[[1]]
xsplit[data.table::rowid(xsplit) >= 3] <- '-'
paste(xsplit, collapse = ',')}
df2 %>% 
unite(concat,CTR1:CTR6, sep = ",") %>%
rowwise() %>%
mutate(concat = ICT_fn(concat)) %>%
separate(concat, paste0("CTR", 1:6), sep = ",", remove = TRUE)

#> # A tibble: 4 x 7
#> ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6
#> <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1 England England - France Germany -
#> 2 2 England France France - Germany England
#> 3 3 England France France Germany Germany -
#> 4 4 France England England - France Germany

关于r - 如何在使用 R 保持原始行顺序的同时按行提取唯一记录和双记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59291888/

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