使用向量从列中子集化

时间:2018-08-10 22:18:25

标签: 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

我正在尝试创建一个新列,将案件分类为暴力或非暴力。 (如果该行中有任何一项法规是暴力的,则该列应显示暴力)

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

但是没有用。我在做什么错了?

2 个答案:

答案 0 :(得分:2)

我们可以使用%in%通过循环显示与Reducelist明显的“暴力”向量中的一项来确定是否存在于“法规”列之一中逻辑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