具有不同 类 的 rbind 数据集
rbind datasets with different classes
我正在尝试 merge/bind 两个数据集(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
这似乎是由于某些变量具有不同的 class 造成的。例如,我有一个变量 "gender"(1 = 男性,2 = 女性)。在合并的数据集中,我确实看到了 mydata_17 的值标签,但是对于其他数据集,我得到了 NA。当我检查 classes 时,R 返回它们是不同的(虽然我不知道为什么会这样?)
> lapply(mydata_103[7], class)
$prgesl
[1] "numeric"
> lapply(mydata_17[7], class)
$prgesl
[1] "factor"
我将 mydata_103 的 class 更改为因子
mydata_103$prgesl <- as.factor(mydata_103$prgesl)
现在,我确实得到了数值,但它仍然没有转换为值标签:
prgesl
15 Man
16 Man
17 Vrouw
18 2
19 2
20 1
21 2
有谁知道如何解决这个问题?有没有办法让我的两个数据集的 classes 相同或检查哪些不同? (我有 404 个变量,因此通过目视检查似乎效率低下且容易出错)。
最好的,Hanneke
编辑:现在合并我的数据集的代码很简单:
data1 <- rbind.data.frame(mydata_17, mydata_103)
按照 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()
应该 return 因子的名称符合数字给定的顺序。
将因子列转换为字符,然后进行 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
我正在尝试 merge/bind 两个数据集(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
这似乎是由于某些变量具有不同的 class 造成的。例如,我有一个变量 "gender"(1 = 男性,2 = 女性)。在合并的数据集中,我确实看到了 mydata_17 的值标签,但是对于其他数据集,我得到了 NA。当我检查 classes 时,R 返回它们是不同的(虽然我不知道为什么会这样?)
> lapply(mydata_103[7], class)
$prgesl
[1] "numeric"
> lapply(mydata_17[7], class)
$prgesl
[1] "factor"
我将 mydata_103 的 class 更改为因子
mydata_103$prgesl <- as.factor(mydata_103$prgesl)
现在,我确实得到了数值,但它仍然没有转换为值标签:
prgesl
15 Man
16 Man
17 Vrouw
18 2
19 2
20 1
21 2
有谁知道如何解决这个问题?有没有办法让我的两个数据集的 classes 相同或检查哪些不同? (我有 404 个变量,因此通过目视检查似乎效率低下且容易出错)。
最好的,Hanneke
编辑:现在合并我的数据集的代码很简单:
data1 <- rbind.data.frame(mydata_17, mydata_103)
按照 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()
应该 return 因子的名称符合数字给定的顺序。
将因子列转换为字符,然后进行 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