##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文件是这样的
现在我想要的列标题不合适。我希望列标题分别为'x','y','z'。第一栏也不应该在那里。
此外,如果您有任何其他有效的方法,请告诉我。谢谢!
答案 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
了解更多信息。