首页 > 解决方案 > 使用向量从列中提取子集

问题描述

目前我的数据如下所示:

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)
}

但它没有用。我究竟做错了什么?

标签: r

解决方案


我们可以用来检查“暴力”向量中的一个条目是否存在于“法规”列之一中,方法是将这些和逻辑%in%循环到单个Reducelistvectorvector

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"   

注意:对于数百列,上述方法并不容易实现。我们可能需要Reduceor 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))

推荐阅读