我正在尝试根据 NA 的条件提取列或数据帧的子集。这是一个例子。我正在寻找一种适用于更多电视类型和颜色的通用解决方案。电视类型的数量将事先已知并存储在变量中。在这种情况下,4.
我有以下数据框,其中第 1 列“颜色”包含行标签/标题:
my_data <- data.frame(
colors = c("Blue", "Red", "Green"),
OLED = c(50, 45, NA),
OLED2 = c(NA, 40, NA),
LCD = c(NA, 40, NA),
CRT = c(NA, 50, 45)
)
我想将以下内容应用于每种电视类型(OLED、OLED2、LCD、CRT)。以下代码适用于CRT的解决方案:
a = my_data[is.na(my_data$OLED) & is.na(my_data$OLED2) & is.na(my_data$LCD),]
是否有一种更优雅、更有效的方法来提取给定列的行,其中所有其他行值均为 NA?理想情况下,此示例的输出是两个数据帧,一个包含 CRT 信息,另一个包含 OLED 信息,因为只有那些列包含所有其他行均为 NA 的行(第一列除外,它更多的是行的标签) 。循环是这里唯一的选择吗?
您可以在这里使用
lapply
:
setNames(
lapply(names(my_data[,-1]), \(x) filter(my_data, if_all(setdiff(names(my_data[,-1]), x), ~is.na(.)))),
names(my_data[,-1]))
其中给出了每种电视类型的列表:
$OLED
colors OLED OLED2 LCD CRT
1 Blue 50 NA NA NA
$OLED2
[1] colors OLED OLED2 LCD CRT
<0 rows> (or 0-length row.names)
$LCD
[1] colors OLED OLED2 LCD CRT
<0 rows> (or 0-length row.names)
$CRT
colors OLED OLED2 LCD CRT
1 Green NA NA NA 45