簡體   English   中英

R function 將所有二進制值為 0 的行轉換為 NA,用於一組多列

[英]R function to convert rows where all binary values are 0 into NA, for a set of multiple columns

我有一個包含多個二進制值的數據集。 我想在加起來為 0 的行中將 0 轉換為 NA。

我將如何 go 這樣做?

例子:

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+)。 有一組這樣的變量,所以我會選擇包含哪些列。

我們可以通過直接賦值來做到這一點:

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 提供的樣本數據作為輸入)

然后我們可以把它變成一個 function 並循環模式:

# 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)
}

我們可以根據數據的列名使用split.default ,即使用gsub刪除列名中的數字,使用它將數據集拆分為list中數據集的子集,然后使用lapply list ,檢查行全部為零 ( i1 ),將這些行分配給NA ( x[i1,] <- NA ),返回數據“x”, cbind在一起

nm1 <- gsub("\\d+", "", names(df1)[-1])
lst1 <- unname(split.default(df1[-1], nm1))
out1 <- do.call(cbind, lapply(lst1, function(x) {
             i1 <- !rowSums(x != 0)
             x[i1,] <- NA
             x}))

並將 output 分配回原始數據集

df1[names(out1)] <- out1

或者創建一個新的數據集

df2 <- cbind(df1[1], out1)

-輸出

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

數據

df1 <- structure(list(RespondentID = 1:3, Popn1 = c(1L, 0L, 1L), Popn2 = c(0L, 
0L, 1L), Popn3 = c(0L, 0L, 0L), Popn20 = c(0L, 0L, 1L), Funding1 = c(1L, 
0L, 0L), Funding2 = c(0L, 0L, 0L),
Funding3 = c(1L, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-3L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM