R语言 按标识符选择列中的最高变量

trnvg8h3  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(143)

我有一个小困难的东西,我相信更好的R用户会发现很容易.我有一个dataframe安排标识符的每一行,然而有些有两行每个标识符.这是因为调查被问了两次,我试图找到最高的两个调查作为一个单一的行.
行被结构化为“标识符”,随后是“二进制变量1”、“二进制变量2”、“二进制变量3”。二进制可以包括NA。
最小可报告示例:

cnames <- c("ID", "bin1", "bin2", "bin3")
a<- c("A", 1, 0, 0)
b <- c("A",0, NA, 1)
c <- c("B", 0, 0, 0)
d <- c("B", 0, 1, 0)
aa<- rbind(cnames, a,b,c,d)
aa <- as.data.frame(aa)

我想创建一个每个标识符只有一行的 Dataframe ,选择NA〈0〈1,例如,示例中的ID“A”将变为c(“A”,1,0,1),“B”将变为c(“B”,0,1,0)。
非常感谢,

jpfvwuh4

jpfvwuh41#

您可以summariseacrossgroup_by列,并获得每列的max值,如下所示:

library(dplyr)
aa %>%
  group_by(ID) %>%
  summarise(across(bin1:bin3, ~ max(as.numeric(.x), na.rm = TRUE)))
#> # A tibble: 2 × 4
#>   ID     bin1  bin2  bin3
#>   <chr> <dbl> <dbl> <dbl>
#> 1 A         1     0     1
#> 2 B         0     1     0

创建于2023-03-27带有reprex v2.0.2

使用数据

cnames <- c("ID", "bin1", "bin2", "bin3")
a<- c("A", 1, 0, 0)
b <- c("A",0, NA, 1)
c <- c("B", 0, 0, 0)
d <- c("B", 0, 1, 0)
aa<- rbind(cnames, a,b,c,d)
aa <- as.data.frame(aa)
colnames(aa) = aa[1,]
aa = aa[2:5,]
hi3rlvi2

hi3rlvi22#

Quinten的解决方案总体上非常好。
然而,代替

aa %>%
  group_by(ID) %>%
  summarise(across(bin1:bin3, ~ max(as.numeric(.x), na.rm = TRUE)))

我会使用不带as.numeric()的命令:

aa %>%
  group_by(ID) %>%
  summarise(across(bin1:bin3, ~ max(.x, na.rm = TRUE)))

原因是,当一个标识符的列的所有元素都是NA时,您会得到意想不到的结果。例如:

cnames <- c("ID", "bin1", "bin2", "bin3")
a <- c("A", 1, NA, 0)
b <- c("A",0, NA, 1)
c <- c("B", 0, 0, 0)
d <- c("B", 0, 1, 0)
aa<- rbind(a,b,c,d)
aa <- as.data.frame(aa) 
colnames(aa) <- cnames

aa %>%
  group_by(ID) %>%
  summarise(across(bin1:bin3, ~ max(as.numeric(.x), na.rm = TRUE)))

为您提供:

ID     bin1  bin2  bin3
  <chr> <dbl> <dbl> <dbl>
1 A         1  -Inf     1
2 B         0     1     0

不使用as.numeric的解决方案会给出所需的结果:

ID    bin1  bin2  bin3 
  <chr> <chr> <chr> <chr>
1 A     1     NA    1    
2 B     0     1     0

相关问题