r - 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+)。有一组这样的变量,所以我会选择包含哪些列。
解决方案
我们可以通过直接赋值来做到这一点:
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)
}
推荐阅读
- python - 不能给酒吧不同的颜色
- c# - 如何将关系 ObjectId 与活动 ObjectId Primavera Web 服务 API 链接
- javascript - forEach 循环中的 setTimeout 仅按顺序显示特定元素
- java - 如何使用 MockMvc 在 Springboot 中测试电子邮件功能?
- shell - 我正在尝试编写一个 shell 程序来一次执行多个命令
- r - 在 R 中处理日期转换
- vue.js - 您如何禁用/修复此特定的默认行为,其中刷新整个网页后仍选择特定的路由器链接
- c# - EF Core Remove-Migration 错误:对象引用未设置为对象的实例
- python - 查找所有组合以将单个列表拆分为两个列表
- nativescript - 在 NativeScript 中有没有办法跨平台安排后台作业?