2013-10-05 76 views
7

我正在試圖找到一種將兩列因子合併到一列而不將因子水平更改爲數字的方法。例如,考慮以下兩個data.frame數據集如何將兩列因子合併到一列中而不將因子水平更改爲數字

dataset 1      dataset 2 
    Number Student     Number Student 
     1 Chris      1 Matt 
     2 Sarah      2 Keith 

我試圖採取從數據集1,並從dataset2「學生」列「學生」欄目,幷包含名稱「一個大學生列克里斯」,‘莎拉’,‘馬特’,和‘基斯’

我想:

student.list<-c(dataset1[,2],dataset2[,2]) 
    student.list 

然而,這並不工作,因爲名字變成數字與C()函數。我希望我的名單保留學生的姓名(即不要將他們轉換成數字)。我也試過cbind()返回,但給出了同樣的問題,爲c()...

謝謝

回答

9

factors數字,正好有標籤。當你綜合考慮因素時,你通常會結合他們的數值。這通常會讓一個人絆倒。

如果你希望自己的標籤,你必須強迫他們爲字符串,使用as.character

student.list <- c(as.character(dataset1[,2]) , 
        as.character(dataset2[,2]) ) 

如果你想要找回來的因素,它包都在as.factor(可都在同一行,或分成兩行更容易閱讀)

student.list <- c(as.character(dataset1[,2]),as.character(dataset2[,2])) 
student.list <- as.factor(student.list) 
+2

我會猜想有一個「聯合」功能,這爲你在基地...?編輯:不要猜測,儘管'gdata'包改變了'c'的因素,使OP的預期行爲。 – Frank

+0

@Frank你可以使用'gdata :: combine',但是你必須過濾掉你需要的東西。這仍然無助於學習如何處理'R' –

3

data.table包,它擴展數據幀的功能在一些非常有用的方法,將自動結合因子當你使用rbindlist功能。另外,如果你的兩個數據集很大,通常會更快地組合它們。

library(data.table) 

# Example data: 
# (If you already have data frames, you can convert them using `as.data.table(dataframename)`) 
dataset1<-data.table(Number=1:2,Student=as.factor(c("Chris","Sarah"))) 
dataset2<-data.table(Number=1:2,Student=as.factor(c("Matt","Keith"))) 


# Combine the two data sets: 
# (It's not necessary to convert factors to characters) 
rbindlist(list(dataset1,dataset2)) 
# Number Student 
#1:  1 Chris 
#2:  2 Sarah 
#3:  1 Matt 
#4:  2 Keith 
1

如果您因素是數據幀裏面,那麼你可以使用rbind這種方式將它們組合:

> df1 <- data.frame(x=factor(c('a','b'))) 
> df2 <- data.frame(x=factor(c('c','d'))) 
> rbind(df1,df2) 
    x 
1 a 
2 b 
3 c 
4 d 
+0

中的因素,但是這將返回一個data.frame,而不是一個向量,更不用說如果您在OP中梳理兩列(即沒有' drop = FALSE'),那麼最終結果仍然是整數表示 –

1

您現在可以fct_c()forcats包做到這一點很容易。

dataset1 <- data.frame(Number = c(1,2), Student = factor(c('Chris','Sarah'))) 
dataset2 <- data.frame(Number = c(1,2), Student = factor(c('Matt','Keith'))) 

library(forcats) 
fct_c(list(dataset1[ ,2], dataset2[ ,2])) 

# [1] Chris Sarah Matt Keith 
# Levels: Chris Sarah Keith Matt