首页 > 解决方案 > R函数将所有二进制值为0的行转换为NA,用于一组多列

问题描述

我有一个包含多个二进制值的数据集。我想在加起来为 0 的行中将 0s 转换为 NA 。

我该怎么做呢?

例子:

RespondentID   Popn1 Popn2 Popn3  ...... Popn20             Funding1   Funding2 Funding3
     1           1     0    0               0                  1           0       1
     2           0     0    0     ......    0                  0           0       1
     3           1     1    0    .......    1                  0           0       0

我想查找特定列的全为 0 的行并将其转换为 NA。例如,我想将 Popn1:Popn20 的第 2 行(其中 respondentID 为 2)转换为 NA,因为它们加起来为 0(假设我没有显示的变量对于该行也全为 0) . 我还想将列 Funding1:Funding3 的第 3 行转为 NA/Blank,因为它们加起来为 0(即所有值都是 0。

有没有办法做到这一点,并且对于许多这样的列?(100+)。有一组这样的变量,所以我会选择包含哪些列。

标签: rbinary

解决方案


我们可以通过直接赋值来做到这一点:

cols = grepl("Popn", names(df1))
df1[rowSums(df1[cols]) == 0, cols] = NA

cols = grepl("Funding", names(df1))
df1[rowSums(df1[cols]) == 0, cols] = NA

df1
#   RespondentID Popn1 Popn2 Popn3 Popn20 Funding1 Funding2 Funding3
# 1            1     1     0     0      0        1        0        1
# 2            2    NA    NA    NA     NA        0        0        1
# 3            3     1     1     0      1       NA       NA       NA

(使用 akrun 提供的样本数据作为输入)

然后我们可以把它变成一个函数并循环模式:

# converts rows that sum to 0 to NA
# within columns that match a pattern
row_0_to_na = function(data, pattern) {
  cols = grepl(pattern, names(data))
  data[rowSums(data[cols]) == 0, cols] = NA
  return(data)
}

patterns = c("Popn", "Funding")
for(pat in patterns) {
  df1 = row_0_to_na(df1, pat)
}

推荐阅读