目前我的数据是这样的:
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)
}但它并没有起作用。我做错了什么?
发布于 2018-08-11 06:21:22
我们可以使用%in%来检查'violent‘向量中的一个条目是否出现在'Statute’列中,方法是循环显示这些条目,并将logical vector的Reduce list添加到一个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% 'violent’还是(|) 'Statute2‘元素是%in% 'violent’来实现这一点,在ifelse中使用它(为了更好地理解)来获得预期的输出
with(data, ifelse((Statute %in% violent) |
(Statute2 %in% violent), "Violent", "Non_Violent"))
#[1] "Violent" "Non_Violent" "Violent" 注意:对于数百列,上述方法并不容易实现。我们可能需要Reduce或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))发布于 2018-08-11 09:16:57
您可以执行以下操作:
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> Violenthttps://stackoverflow.com/questions/51794662
复制相似问题