2016-08-22 20 views
1
##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文件是這樣的`rbind`數據幀的所有列的唯一項,並將其寫入到CSV文件

enter image description here

現在的列標題我想都沒有正確。我希望列標題分別爲'x','y','z'。第一列也不應該在那裏。

此外,如果你有任何其他有效的方式來做到這一點,讓我知道。謝謝!

+0

你可以像這樣改變列名http://stackoverflow.com/a/6081514/3519000,你可以跳過像這樣的行名http://stackoverflow.com/questions/7484325/prevent-row-names -to-被寫入到文件時,使用直寫式CSV。至於你的循環效率,我會建議你再次瀏覽StackOverflow。謝謝 – lrnzcig

回答

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 = ",")。試圖在write.csv中使用col.names將生成警告。


更有效的方式

我會避免使用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更多。

+0

我想在數據幀(g)/ csv文件(比如標籤)中多出一列。它會根據列的唯一條目數從1重複到n。例如:對於sepal.length,它將從1開始到35 ...然後對於sepal.width,它將再次從1開始到22。 –

相關問題