根据R中的单个字符列创建包含多个列的新数据框

时间:2015-05-12 18:54:30

标签: r

我有一份植物物种清单和它们所在的县。我想创建一个新的数据框架,其中包含每个县的植物种类和列,如果该植物发生在该县,则为1,如果不是,则为0。

以下是一些示例数据:

Accepted.Symbol County
ABRON   TX(Andrews, Armstrong, Bailey, Brewster)
ABAM2   TX(Brooks, Hidalgo, Jim Hogg, Kenedy, Kleberg, Live Oak, Starr)
ABAN    TX(Brewster, Culberson, El Paso, Ellis, Hudspeth, Presidio, Reeves)
ABCA    TX(Culberson)
ABFR2   TX(Andrews, Armstrong, Bailey, Briscoe)
ABMA5   TX(Freestone, Leon, Robertson)
ABUTI   TX(Andrews, Aransas, Atascosa, Bastrop)

县名单数据示例:

 Anderson
 Andrews
 Angelina
 Aransas
 Archer

这就是我想要输出的样子(请注意,植物列的名称无关紧要,但是县列的名称是这样的):

Plant  Anderson  Andrews
ABRON  0         1
ABAM2  0         0

我已经编写了一个尝试重新组织的功能,因为我必须定期更新它。在下面的函数中,“data”是有县的植物列表,“list”是所有县的单独列表。

county.list<-function(data, list) {
  output <- data.frame(data$Accepted.Symbol) #creates output dataset
    for (i in 1:length(list)) {
      county<-list[i]
    test<-grepl(as.character(county), data$County) #outputs T/F for county name
    test.1<-test*1                                 #converts T/F to 1/0
    output<-cbind(output, test.1)                #adds column to output dataset
    names(output)[names(output)=="test.1"] <- as.character(county) #renames column
    }
return(output)}

t1<-county.list(plants,counties)

当我运行此函数时,我得到一个包含2列的数据帧。第一个包含所有工厂代码。第二列全为0,列名为“c(1,2,3,...,267)”。当我测试“for”循环之外的步骤(对于一个县)时,每个步骤都有效,所以我怀疑问题出在循环中。

我已经搜索了其他类似的问题,但没有一个能完全捕捉到我想要做的事情。我愿意使用除循环之外的方法,如果能更好的话。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我们可以在&#39;县&#39;中移除括号()(前的前缀。第一个数据集的列(&#39; df1&#39;),使用cSplit中的splitstackshape分割(,)&#39;县&#39;并将数据集格式化为long,更改&#39; Accepted.Symbol&#39;到因素&#39;类,将关键列设置为&#39;县&#39; (setkey),加入&#39; df2&#39;,然后dcast加入来自data.table的devel版本来自&#39; long&#39;格式为&#39; wide&#39;。

安装data.table的devel版本的说明是here

library(data.table)#v1.9.5+
library(splitstackshape)
df1$County <- gsub('.*\\(|\\)', '', df1$County)
dcast(
   setkey(
     cSplit(df1, 'County', ',', 'long')[,
         Accepted.Symbol:= factor(Accepted.Symbol)],
          County)[df2],
    Accepted.Symbol~County, value.var='County', length, drop=FALSE)

数据

df1 <- structure(list(Accepted.Symbol = c("ABRON", "ABAM2", "ABAN", 
"ABCA", "ABFR2", "ABMA5", "ABUTI"), County = c("TX(Andrews, Armstrong, 
Bailey, Brewster)", 
"TX(Brooks, Hidalgo, Jim Hogg, Kenedy, Kleberg, Live Oak, Starr)", 
"TX(Brewster, Culberson, El Paso, Ellis, Hudspeth, Presidio, Reeves)", 
"TX(Culberson)", "TX(Andrews, Armstrong, Bailey, Briscoe)", 
"TX(Freestone, Leon, Robertson)", 
"TX(Andrews, Aransas, Atascosa, Bastrop)")), 
 .Names = c("Accepted.Symbol", 
 "County"), class = "data.frame", row.names = c(NA, -7L))

 df2 <- structure(list(County = c("Anderson", "Andrews", "Angelina", 
 "Aransas", "Archer")), .Names = "County", class = "data.frame",
 row.names = c(NA, -5L))
相关问题