[英]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.