2013-10-05 5 views
7

Я пытаюсь найти способ объединить два столбца факторов в один столбец, не меняя уровни факторов на числа. Например, рассмотрим следующие два data.frame наборов данныхКак объединить два столбца факторов в один столбец без изменения уровней факторов в число

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

Я пытаюсь взять столбец «студент» из DataSet1 и колонки «студент» из dataset2, и сделать одну большую колонку студента, содержащий имена " Крис»,„Сара“,„Matt“и„Кит“

Я пробовал:

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

Однако, это не работает, так как имена превращается в числа с с функцией(). Я хочу, чтобы в моем списке сохранялись имена студентов (т. Е. Без преобразования их в числа). Я также попытался cbind(), но дает такую ​​же проблему, как с() ...

Спасибо

ответ

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

Я бы предположил, что существует функция «комбинирования», которая делает это для вас в базе ...? EDIT: предположим, что нет, хотя пакет 'gdata' изменяет' c' на факторы, чтобы иметь ожидаемое поведение OP. – Frank

+0

@Frank вы можете использовать 'gdata :: comb', но тогда вам придется отфильтровывать то, что вам нужно. И это все равно не помогло бы узнать, как обрабатывать факторы в '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 
Смежные вопросы