r - 使用向量从列中提取子集
问题描述
目前我的数据如下所示:
head(data)
Person Statute Statute2
1 21 O.S. 1 22 O.S. 3
2 21 O.S. 14 NA
3 22 O.S. 3 NA
我正在尝试创建一个新列,将案件分类为暴力或非暴力。(如果该行中的任何一项法规是暴力的,则该列应指示 VIOLENT)
Person Statute Statute2 Type
1 21 O.S. 1 22 O.S. 3 Violent
2 21 O.S. 14 NA Non-violent
3 22 O.S. 3 NA Violent
我为我的暴力犯罪创建了一个向量:
violent <- c("22 O.S. 3", "24 O.S. 6", "22 O.S. 16")
我试图弄清楚如何将我的非暴力罪行编码为非暴力。我不能像暴力的那样一一做,因为案例太多了。我试过了:
nonviolent <- function(x) {
!(violent)
}
但它没有用。我究竟做错了什么?
解决方案
我们可以用来检查“暴力”向量中的一个条目是否存在于“法规”列之一中,方法是将这些和逻辑%in%
循环到单个Reduce
list
vector
vector
data$Type <- c("Violent", "Non-Violent")[Reduce(`|`,
lapply(data[2:3], function(x) x %in% violent)) + 1]
data$Type
#[1] "Non-Violent" "Violent" "Non-Violent"
由于上述解决方案对于新用户来说可能很难。因此,我们也可以通过检查“Statute”元素是否为%in%
“暴力”或(|
)“Statute2”元素是否为%in%
“暴力”来做到这一点,在ifelse
(为了更好地理解)中使用它来获得预期的输出
with(data, ifelse((Statute %in% violent) |
(Statute2 %in% violent), "Violent", "Non_Violent"))
#[1] "Violent" "Non_Violent" "Violent"
注意:对于数百列,上述方法并不容易实现。我们可能需要Reduce
or rowSums
(在逻辑上vector
)来获得预期的输出
数据
data <- structure(list(Person = 1:3, Statute = c("21 O.S. 1", "21 O.S. 14",
"22 O.S. 3"), Statute2 = c("22 O.S. 3", NA, NA)), .Names = c("Person",
"Statute", "Statute2"), class = "data.frame", row.names = c(NA,
-3L))
推荐阅读
- javascript - 将二维数组变成一棵树
- node.js - 没有firebase的Dialogflow nodejs实现
- deep-learning - 表示图像到类别映射所需的位
- npm - npm 重建错误:找不到 Python 可执行文件“python”
- db2 - 尝试将 HammerDB 连接到 Db2 for z/OS 时出现 SQL0199N 错误
- wpf - WPF - 在绑定触发期间 ImageSource 更改后图像失真
- c# - 如何使用 openfiledailog 将此代码更改为另一个代码
- install4j - install4j:将 VM 选项传递给启动器
- angular - Angular 6 aws-sdk 仅使用 cognito 身份凭证
- java - 如何获取员工ID并将其放入其他元素