如何将R中的df与类别值合并为另一个df及其相应的值?

时间:2017-05-13 09:40:31

标签: r merge label levels

编辑:改述: 所描述的情况可以是从不同统计程序中提取数据的结果,其可以产生具有(a)因子水平的单独的csv文件和(b)其相应的分配的数字"值。

1)我可能有许多因子变量,例如性别,年龄范围和这些因素变量具有例如男/女,18-30 / 31-40等 2)这些级别分配给某些数字,无论是否有序。 3)因子/水平数据帧是一个数据帧/数据集。分配给因子水平数据集是一个分离的数据帧。 4)我想将这两个数据集合并为一个数据集。 这意味着必须保留有序因子水平并将其正确分配给相应的数字。

因此,因子水平及其分配的数字被保存在两个不同的数据集中(例如csv文件)。这两个数据帧必须"合并"。

我该怎么做? 附:这两个数据集之间有一个cmmon ID变量。

              d1_levels          d2_levels      d3_levels
1               2                   2               0
2               0                   1               2
3               1                   2               1
4               2                   2               2


              d1_labels        d2_labels      d3_labels                                 
1               boy              east               <3kg
2               dont know        south              3kg
3               girl             east               >3kg
4               boy              east               3kg

我想为d1_labels提供相同的结果,作为以下R命令的结果

dataset$d1_labels<- factor(d1_levels, levels = c(0,1,2), labels = c("dont know", "girl", "boy"))

1 个答案:

答案 0 :(得分:1)

问题不完全清楚:

  • 当我们讨论根据某个键组合的两个data.frames时,使用术语merge
  • 条款levelslabelsfactors
  • 一起使用

我们将尝试这两种变体,并希望OP将指定他的目标。

合并

merge(DF1, DF2, by = "rn")
#  rn d1_levels d2_levels d3_levels d1_labels d2_labels d3_labels
#1  1         2         2         0       boy      east      <3kg
#2  2         0         1         2 dont know     south       3kg
#3  3         1         2         1      girl      east      >3kg
#4  4         2         2         2       boy      east       3kg 

因子

reorder(factor(DF2$d1_labels), DF1$d1_levels)
#[1] boy       dont know girl      boy      
#attr(,"scores")
#      boy dont know      girl 
#        2         0         1 
#Levels: dont know girl boy

reorder(factor(DF2$d2_labels), DF1$d2_levels)
#[1] east  south east  east 
#attr(,"scores")
# east south 
#    2     1 
#Levels: south east

reorder(factor(DF2$d3_labels), DF1$d3_levels)
#[1] <3kg 3kg  >3kg 3kg 
#attr(,"scores")
#<3kg >3kg  3kg 
#   0    1    2 
#Levels: <3kg >3kg 3kg

factor()创建因子,reorder()根据levels列中给出的顺序对因子级别进行排序。在R中,级别的编号从1开始。

单个结果可以组合回一个数据帧(但请注意,这不是R中首选的手动转换多个列的方式。)

result <- data.frame(
  rn = DT1$rn,
  d1 = reorder(factor(DF2$d1_labels), DF1$d1_levels),
  d2 = reorder(factor(DF2$d2_labels), DF1$d2_levels),
  d3 = reorder(factor(DF2$d3_labels), DF1$d3_levels)
)

组合多个因子列的级别和标签

OP澄清了这个问题,并requested将水平和标签组合在一起,例如500个因子列。

不幸的是,这非常复杂,因为它需要汇总来自两个不同数据框架的数据。如果两个data.frames中的匹配列的名称相同,例如d1,则会容易得多。因此,我们必须将d1_levels的{​​{1}}与来自DF1的{​​{1}}汇集在一起​​。

获取列的基本名称

d1_labels

创建新的data.frame

DF2