【问题标题】:Subsetting in R using OR condition with strings在 R 中使用 OR 条件和字符串进行子集化
【发布时间】:2011-01-08 16:11:26
【问题描述】:

我有一个大约 40 列的数据框,第二列 data[2] 包含其余行数据描述的公司名称。但是,公司名称因年份而异(2009 年数据为 09,2010 年无数据)。

我希望能够对数据进行子集化,这样我就可以同时提取两年的数据。这是我正在尝试做的一个示例...

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

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

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

subset(data, data[[2]] == grep("Company Name", data[[2]]))

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

任何想法都会被欣赏。

【问题讨论】:

  • 您的意思是子集(data, data[,2] == "Company Name 09" | data[,2] == "Company Name", drop = T)
  • 语法,我最大的敌人。谢谢乔纳森。这正是我想要做的。

标签: r subset


【解决方案1】:

首先(正如 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)

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

【讨论】:

  • 感谢 Marek,第二个解决方案更加简洁并简化了代码。当我搜索 ??string 时,grepl 不在我的文档中。
  • 非常感谢 Marek,甚至不知道子集接受 %in%。这可以节省大量使用 OR 子句的繁琐/容易出错的输入。 +1!!到目前为止我本周的回答!
  • 列名有空格怎么办?例如“公司名称”。我们还能使用子集吗
  • @RockScience 是的。但是你必须使用反引号。 subset(data, 'Company Name'=="Name A") 之类的东西(我不能在评论中使用“真正的”反引号,所以你必须更改它)。
  • 我可以问一个愚蠢的问题吗? drop 参数有什么作用?我并没有真正得到帮助中的描述。
【解决方案2】:

有几点:

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> 

现在您应该能够对动态转换的数据执行您的子集:

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> 

您也可以用正则表达式的值替换名称列。

【讨论】:

  • Jonathan 在上面的评论中给了我想要的答案。但是您的帖子解决了我遇到的另一个类似问题。谢谢德克。
  • 我的荣幸 - 很高兴它有帮助。
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多