[英]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'列中,使用cSplit
的splitstackshape
拆分( ,
)'County'并将数据集格式化为long,更改将'Accepted.Symbol'设置为'factor'类,将键列设置为'County'( setkey
),与'df2' dcast
,然后从dcast
的devel版本将data.table
从'long'格式更改为'wide'。
安装data.table
开发版本的data.table
在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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.