我有一个数据框,其中包含多个列,其中包含一个诊断的信息。条目为TRUE
、FALSE
或NA
。我创建一个向量,将这些列总结如下:如果患者在某个时间被诊断(TRUE
),则TRUE
,如果唯一有效的条目是FALSE
,则FALSE
,如果只是缺失,则NA
。以代码形式编写的文本:
data.frame(a= c(FALSE, TRUE, NA, FALSE, TRUE, NA, FALSE, TRUE, NA),
b= c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, NA, NA, NA),
expected= c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, NA))
字符串
我需要按行遍历所有列,我使用split
来完成。不幸的是,我的数据很大,需要很长时间。我现在做的是
library(magrittr)
# big example data
df <- expand.grid(c(FALSE, TRUE, NA), c(FALSE, TRUE, NA)) %>%
.[rep(1:nrow(.), 50000), ] %>%
as.data.frame() %>%
setNames(., nm= c("a", "b"))
# My approach
df$res <- df %>%
split(., 1:nrow(.)) %>%
lapply(., function(row_i){
ifelse(all(is.na(row_i)), NA,
ifelse(any(row_i, na.rm= TRUE), TRUE,
ifelse(any(!row_i, na.rm= TRUE), FALSE,
row_i)))
}) %>%
unlist()
型
有没有更有效的方法来解决这个问题?
6条答案
按热度按时间hc2pp10m1#
使用
pmax()
的矢量化解决方案:字符串
您还可以将所有参数合并到一个列表中,以避免
do.call()
中的匿名函数。型
qc6wkl3g2#
一个选项是使用dplyr包中的向量化
case_when()
函数(https://dplyr.tidyverse.org/reference/case_when.html),例如:字符串
创建于2023-07-18,使用reprex v2.0.2
Benchmark(6 yo酷睿-i5 MacBook Pro; 2023年7月20日更新):
型
x1c 0d1x的数据
mhd8tkvw3#
字符串
u7up0aaq4#
字符串
创建于2023-07-18,使用reprex v2.0.2
oxosxuxt5#
另一种可能的方法:
字符串
这给了
型
enxuqcxy6#
您可以像下面这样使用
rowSums
+rowMean
+is.na
字符串
数据
型