2014-01-29 26 views
1

我想創建一個空數據框,其中數據將是字符串,並且stringsAsFactors設置爲FALSE。看起來,當我這樣做時,它不記得stringsAsFactors的價值。但使用stringsAsFactors創建空數據框= FALSE

> df <- data.frame(a="", b="", stringsAsFactors=FALSE) 
> new.row <- c("a", "z") 
> df <- rbind(df, new.row) 
> df 
    a b 
1  
2 a z 
> df[2,1] <- "q" 
> df 
    a b 
1  
2 q z 

,我想一個空的數據幀:

它的工作原理,如果我創建一個空白行,像這樣。當我這樣做,雖然,它把我後來添加爲因素的字符串:

> df2 <- data.frame(a=character(), b=character(), stringsAsFactors=FALSE) 
> df2 <- rbind(df2, new.row) 
> df2 
    X.a. X.z. 
1 a z 
> df2[2,1] <- "q" 
Warning message: 
In `[<-.factor`(`*tmp*`, iseq, value = "q") : 
    invalid factor level, NA generated 

我怎樣才能創建一個沒有串因素的空數據幀?

+1

你需要使用一個data.frame如果所有列是性格?這將工作:'mat < - matrix('',nr = 1,nc = 2,dimnames = list(NULL,c('a','b'))); new.row < - c('a','z'); rbind(mat,new.row)' – jbaums

+0

我可能是錯的,但那是一個「過程」選項,而不是一個屬性或某個對象的東西。在data.frame創建過程中,數據按照您用'stringsAsFactors'請求的方式處理,然後使用正確的類型進行存儲。正如你注意到的那樣,如果不能隱式輸入類型,你會遇到問題。你不能按照你想要的方式做你想做的事。你可以用as.character()來轉換每一次賦值,但是如果你經常使用字符串和'rbind',很可能你做錯了。 – mlt

+0

謝謝,使用矩陣來解決我的問題,但我不明白爲什麼有一個表中所有列包含字符串的表將被視爲數據框的不恰當使用。 – Barbara

回答

5

rbind.data.frame先丟棄所有零行和零列data.frames,然後將其餘參數強制轉換爲data.frames。此內部強制在強制中使用stringsAsFactorsdefault值。 (參見幫助rbinddata frame methods下。

您可以通過設置

options(stringsAsFactors=FALSE) 
# now it works as you wish 
str(rbind(df2,new.row)) 
# 'data.frame': 1 obs. of 2 variables: 
# $ X.a.: chr "a" 
# $ X.z.: chr "z" 
+0

這會影響字符串的所有後續處理,而不會影響OP請求的特定數據幀。 – mlt

+0

@mlt'df2'創建時沒有因素(手動設置'stringsAsFactors = FALSE')。問題在於它是一個0行的data.frame。因此,在s3方法派發到'rbind.data.frame'之後,它將從綁定在一起的列表中刪除。 'new.row'被強制爲兩列data.frame,並使用'default.stringsAsFactors()',它調用'getOption(「stringsAsFactors」)'。 – mnel

+0

我想它也很容易恢復設置後... – thelatemail

0

我一直在尋找一個答案,這個同樣的問題,找不到任何設置這個值,所以我寫了我自己的功能:

row.add <- function(x,newRow) 
{ 
    cn <- colnames(x) 
    x <- data.frame(lapply(x,as.character),stringsAsFactors = FALSE) 
    x <- rbind(x,newRow) 
    colnames(x) <- cn 

    return(x) 
} 

df <- data.frame("a"=character(),"b"=character()) 
df <- row.add(df,c("A","Z")) 
df <- row.add(df,c("B","X")) 

希望有人尋找一個類似的答案會發現這個有用

相關問題