如何从给定列的所有其他行条目均为 NA 的数据帧中提取(作为数据帧)列?

问题描述 投票:0回答:1

我正在尝试根据 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 的行(第一列除外,它更多的是行的标签) 。循环是这里唯一的选择吗?

r
1个回答
0
投票

您可以在这里使用

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
© www.soinside.com 2019 - 2024. All rights reserved.