Как объединить два столбца факторов в один столбец, не меняя уровни факторов на число

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

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

Я пытаюсь взять столбец "ученик" из набора данных1 и столбца "ученик" из набора данных2 и сделать один большой столбец студентов с именами "Крис", "Сара", "Мэтт" и "Кит",

Я пробовал:

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

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

Спасибо

Ответ 1

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

Пакет 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 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

Ответ 3

В базовом пакете R. есть функция interaction(). В пакете для survival также есть функция strata().

Ответ 4

Теперь вы можете легко сделать это с помощью 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

Ответ 5

Если факторы находятся внутри кадров данных, вы можете комбинировать их таким образом, используя 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