繁体   English   中英

基于R中的单个字符列创建具有多列的新数据框

[英]Create new dataframe with multiple columns based on single character column in 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

我编写了一个函数来尝试这种重组,因为我将不得不定期对其进行更新。 在下面的功能中,“数据”是具有县的工厂列表,“列表”是所有县的单独列表。

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)

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

我已经搜索了其他类似的问题,但没有一个能完全抓住我想做的事情。 我愿意使用除循环以外的其他方法,如果这样做会更好。

提前致谢。

我们可以删除括号()和前缀(在第一个数据集('df1')的'County'列中,使用cSplitsplitstackshape拆分( , )'County'并将数据集格式化为long,更改将'Accepted.Symbol'设置为'factor'类,将键列设置为'County'( setkey ),与'df2' dcast ,然后从dcast的devel版本将data.table从'long'格式更改为'wide'。

安装data.table开发版本的data.tablehere

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM