Как объединить два столбца факторов в один столбец, не меняя уровни факторов на число
Я пытаюсь найти способ объединить два столбца факторов в один столбец, не меняя уровни факторов на числа. Например, рассмотрим следующие два набора данных 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