我有一个包含大约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]]))
使用字符串函数可能有更简单的方法吗?
任何想法都会被贬低。
答案 0 :(得分:16)
首先(正如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
的逻辑向量进行匹配。
答案 1 :(得分: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>
你也可以用regexp'ed值替换name列。