`rbind`数据帧所有列的唯一条目,并将其写入csv文件

时间:2016-08-22 15:50:35

标签: r dataframe

##Initialise empty dataframe
g <-data.frame(x= character(), y= character(),z=numeric())

## Loop through each columns and list out unique values (with the column name)
for(i in 1:ncol(iris))
{
a<-data.frame(colnames(iris)[i],unique(iris[,i]),i)
g<-rbind(g,a)
setNames(g,c('x','y','z'))
}
## write the output to csv file
write.csv(g,"1.csv")

输出CSV文件是这样的

enter image description here

现在我想要的列标题不合适。我希望列标题分别为'x','y','z'。第一栏也不应该在那里。

此外,如果您有任何其他有效的方法,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

这将完成工作:

for(i in 1:ncol(iris))
{
a<-data.frame(colnames(iris)[i],unique(iris[,i]),i)
g<-rbind(g,a)
}
g <- setNames(g,c('x','y','z'))   ## note the `g <-`
write.csv(g, file="1.csv", row.names = FALSE)   ## don't write row names

setNames返回名为“x”,“y”和“z”的新数据框,而不是更新输入数据框g。您需要明确的作业<-才能进行“替换”。您可以使用两个

之一隐藏此类<-
names(g) <- c('x','y','z')
colnames(g) <- c('x','y','z')

或者,您可以在col.names内使用write.table参数:

for(i in 1:ncol(iris))
{
a<-data.frame(colnames(iris)[i],unique(iris[,i]),i)
g<-rbind(g,a)
}
write.table(g, file="a.csv", col.names=c("x","y","z"), sep =",", row.names=FALSE)

write.csv()不支持col.names,因此我们使用write.table(..., sep = ",")。尝试在col.names中使用write.csv会产生警告。

更有效的方法

我会避免在循环中使用rbind。我愿意:

x <- lapply(iris, function (column) as.character(unique(column)))
g <- cbind.data.frame(stack(x), rep.int(1:ncol(iris), lengths(x)))
write.table(g, file="1.csv", row.names=FALSE, col.names=c("x","y","z"), sep=",")

阅读?lapply?stack了解更多信息。