当前我的数据如下:
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
我正在尝试创建一个新列,将案件分类为暴力或非暴力。 (如果该行中有任何一项法规是暴力的,则该列应显示暴力)
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)
}
但是没有用。我在做什么错了?
答案 0 :(得分:2)
我们可以使用%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"
由于上述解决方案对于新用户而言可能很难。因此,我们还可以通过检查“法规”元素是%in%
“暴力”还是(|
)“法规2”元素是%in%
“暴力”来实现此目的,请在{{ 1}}(以便更好地理解)以获得预期的输出
ifelse
注意:对于数百列,上述方法不容易实现。我们可能需要with(data, ifelse((Statute %in% violent) |
(Statute2 %in% violent), "Violent", "Non_Violent"))
#[1] "Violent" "Non_Violent" "Violent"
或Reduce
(在逻辑rowSums
上)才能获得预期的输出
vector
答案 1 :(得分:0)
您可以这样做:
cbind(data,
Type = c("Non-Violent","Violent")[grepl(paste0(violent,collapse = "|"),do.call(paste,data))+1])
Person Statute Statute2 Type
1 1 21 O.S. 1 22 O.S. 3 Violent
2 2 21 O.S. 14 <NA> Non-Violent
3 3 22 O.S. 3 <NA> Violent