如何将两列因子组合成一列而不将因子级别更改为数字

时间:2013-10-05 19:23:04

标签: r

我试图找到一种方法将两列因子组合成一列而不将因子水平更改为数字。例如,考虑以下两个data.frame数据集

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

我正在尝试从数据集1中取出“学生”列,从数据集2中取出“学生”列,然后创建一个包含名称“Chris”,“Sarah”,“Matt”和“Keith”的大学生列

我试过了:

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

然而,这不起作用,因为名称变成带有c()函数的数字。我希望我的列表保留学生的姓名(即不将其转换为数字)。我也试过cbind(),但是给出了与c()...

相同的问题

谢谢

5 个答案:

答案 0 :(得分:10)

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)

答案 1 :(得分: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'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

答案 2 :(得分:2)

基本R程序包中有interaction()函数。 strata()包中还包含survival函数。

答案 3 :(得分: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

答案 4 :(得分:0)

如果因子在数据框内,那么您可以使用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