具有不同类{r}的数据集

时间:2017-08-14 13:39:01

标签: r class dataframe rbind

我正在尝试合并/绑定两个数据集(mydata_103和mydata_17)。它们具有完全相同的变量名称,但是我得到了4条这些警告消息

Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = c(1, 1, 2, 1, 1, 1, 1, 1, 5,  :
invalid factor level, NA generated

这似乎是由于某些变量具有不同的类而引起的。例如,我有一个变量“性别”(1 =男性,2 =女性)。在合并的数据集中,我确实看到mydata_17的值标签,但是对于其他数据集,我得到NA。当我检查课程时,R返回它们是不同的(我不知道为什么会出现这种情况?)

 > lapply(mydata_103[7], class)
$prgesl
[1] "numeric"

> lapply(mydata_17[7], class)
$prgesl
[1] "factor"

我将mydata_103的类更改为factor

mydata_103$prgesl <- as.factor(mydata_103$prgesl)

现在,我确实得到了数值,但它仍然没有转换为值标签:

    prgesl
15     Man
16     Man
17   Vrouw
18       2
19       2
20       1
21       2

有谁知道如何解决这个问题?有没有办法让我的两个数据集的类相同或检查哪些不同? (我有404个变量,所以通过视觉检查来检查这个变量似乎是无效的并且容易出错)。

Best,Hanneke

编辑:现在合并我的数据集的代码很简单:

data1 <- rbind.data.frame(mydata_17, mydata_103)

2 个答案:

答案 0 :(得分:1)

根据mtoto的建议,您要先将所有内容转换为数字,然后使用levels()功能将数字转换为标签。

 mydata_17$prgesl <- as.numeric(mydata_17$prgesl)
 mydata<- rbind(mydata_17,mydata_103)
 labels <- levels(mydata_103$prgesl)
 mydata_103$prgesl <-labels[mydata_103$prgesl]

levels()应该返回因素对数字给出的顺序的名称。

答案 1 :(得分:1)

将因子列转换为字符然后转换为rbind,例如:

# reproducible data
set.seed(1)
df1 <- data.frame(x = 1:3, y = runif(3))
df2 <- data.frame(x = letters[2:4], y = runif(3))

# below rbind will introduce NAs
rbind.data.frame(df2, df1)
# x         y
# 1    b 0.9082078
# 2    c 0.2016819
# 3    d 0.8983897
# 4 <NA> 0.2655087
# 5 <NA> 0.3721239
# 6 <NA> 0.5728534
# Warning message:
#   In `[<-.factor`(`*tmp*`, ri, value = 1:3) :
#   invalid factor level, NA generated

# Convert factors to character
i <- sapply(df1, is.factor)
df1[i] <- lapply(df1[i], as.character)
i <- sapply(df2, is.factor)
df2[i] <- lapply(df2[i], as.character)

# now bind
res <- rbind.data.frame(df2, df1)

str(res)
# 'data.frame': 6 obs. of  2 variables:
#   $ x: chr  "b" "c" "d" "1" ...
# $ y: num  0.908 0.202 0.898 0.266 0.372 ...

res
#   x         y
# 1 b 0.9082078
# 2 c 0.2016819
# 3 d 0.8983897
# 4 1 0.2655087
# 5 2 0.3721239
# 6 3 0.5728534