使用带条件的OR条件在R中进行子集

Bra*_*sen 10 r subset

我有一个包含大约40列的数据框,第二列,data [2]包含其余行数据描述的公司名称.但是,这些公司的名称根据年份的不同而不同(2009年的数据为09年,2010年没有).

我希望能够对数据进行子集化,以便我可以同时使用这两年.这是我正在尝试做的一个例子......

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 
Run Code Online (Sandbox Code Playgroud)

基本上,我在子集函数中使用OR运算符时遇到了困难.

但是,我尝试了其他替代方案:

subset(data, data[[2]] == grep("Company Name", data[[2]]))
Run Code Online (Sandbox Code Playgroud)

也许使用字符串函数有一种更简单的方法吗?

任何想法都会被贬低.

Mar*_*rek 17

首先(正如Jonathan在他的评论中所做的那样)引用第二列你应该使用data[[2]]或者data[,2].但是如果你使用子集,你可以使用列名:subset(data, CompanyName == ...).

对于你的问题,我会做一个:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)
Run Code Online (Sandbox Code Playgroud)

在第二个我使用grepl(引入R版本2.9),返回逻辑向量与TRUE匹配.


Dir*_*tel 5

有几件事:

1)模拟数据很有用,因为我们不确切知道你面临的是什么.请尽可能提供数据.也许我误解了以下内容?

2)不要[[2]]用来索引你的data.frame,我认为[,"colname"]更清晰

3)如果唯一的区别是名称中的尾随'09',那么只需将其复制出来:

R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R> 
Run Code Online (Sandbox Code Playgroud)

现在,您应该能够在即时转换的数据上执行您的子集:

R> data <- data.frame(value=1:4, name=x1)
R> subset(data, gsub(" 09$", "", name)=="foo")
  value   name
1     1 foo 09
4     4    foo
R> 
Run Code Online (Sandbox Code Playgroud)

您还可以使用regexp'ed值替换name列.