首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用向量从列中提取子集

使用向量从列中提取子集
EN

Stack Overflow用户
提问于 2018-08-11 06:18:25
回答 2查看 64关注 0票数 1

目前我的数据是这样的:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

我为我的暴力攻击创建了一个载体:

代码语言:javascript
复制
violent <- c("22 O.S. 3", "24 O.S. 6", "22 O.S. 16") 

我在想如何将我的非暴力行为编码为非暴力行为。我不能像暴力那样一个接一个地做,因为案例太多了。我试过了:

代码语言:javascript
复制
nonviolent <- function(x) {
!(violent)
}

但它并没有起作用。我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-08-11 06:21:22

我们可以使用%in%来检查'violent‘向量中的一个条目是否出现在'Statute’列中,方法是循环显示这些条目,并将logical vectorReduce list添加到一个vector

代码语言:javascript
复制
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中使用它(为了更好地理解)来获得预期的输出

代码语言:javascript
复制
with(data, ifelse((Statute %in% violent) | 
               (Statute2 %in% violent), "Violent", "Non_Violent"))
#[1] "Violent"     "Non_Violent" "Violent"   

注意:对于数百列,上述方法并不容易实现。我们可能需要ReducerowSums (在逻辑vector上)来获得预期输出

数据

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2018-08-11 09:16:57

您可以执行以下操作:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51794662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档