10

我有一个大约 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]]))

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

任何想法都会受到赞赏。

4

2 回答 2

18

首先(正如乔纳森在他的评论中所做的那样)要引用第二列,您应该使用data[[2]]or 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)

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

于 2010-01-24T12:09:44.057 回答
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> 

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

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> 

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

于 2010-01-23T23:59:35.593 回答