【问题标题】:How to substitute values from one data.frame by values of another one?如何用另一个data.frame的值替换一个data.frame的值?
【发布时间】:2015-07-15 19:00:04
【问题描述】:

我有两个 data.frames - 第一个是编码的:

correlations <- data.frame(var1 = c('a','a','a','b','e'), var2 = c('b','c','d','e','c'), r = runif(5,0.5,1))
correlations

var1 var2          r
   a    b  0.6702400
   a    c  0.7301086
   a    d  0.5727880
   b    e  0.5916388
   e    c  0.5510549

第二个包含该代码的密钥:

D <- data.frame(code = letters[1:5],name=c('setosa','bulbifer','rubra','minor','nigra'))
D

  code     name
   a     setosa
   b   bulbifer
   c      rubra
   d      minor
   e      nigra

我需要通过第二个 data.frame 中的变量 codename 重新编码第一个数据集 D。 结果:

     var1     var2          r
   setosa bulbifer  0.6702400
   setosa    rubra  0.7301086
   setosa    minor  0.5727880
 bulbifer    nigra  0.5916388
    nigra    rubra  0.5510549

我不知道如何实现这一点(我需要一些功能,如合并、替换、映射或其他,但没有什么适合这个)。

【问题讨论】:

  • 现实生活中correlations有多少列?

标签: r merge dplyr


【解决方案1】:

试试这个库dplyr

library(dplyr)

D <- left_join(correlations, D, by=c("var1" ="code")) %>% 
  left_join(D, by=c("var2" ="code")) %>% select(name.x, name.y, r) %>% 
  rename(var1=name.x, var2=name.x)

逻辑是:与correlations 连接两次,一次在var1 上,然后在var2 上。然后删除旧的var1var2,然后重命名新的变量。

【讨论】:

  • 非常好!我必须更多地了解这个功能。我听说过 left join,但与 R 无关,我没想到它会这么容易......谢谢!
【解决方案2】:

您也可以merge 两次?使用“var1”而不是“code”作为代码表中的列名。

correlations <- data.frame(var1 = c('a','a','a','b','e'), var2 = c('b','c','d','e','c'), r = runif(5,0.5,1))
D <- data.frame(var1 = letters[1:5],name=c('setosa','bulbifer','rubra','minor','nigra'))

output1 <- merge(D, correlations, by = "var1", all.y = TRUE)
output1$var1 <- NULL
names(output1)[2] = "var1"
output2 <- merge(D, output1, by = "var1", all.y = TRUE)

> output2
  var1   name.x   name.y         r
1    b bulbifer   setosa 0.7328087
2    c    rubra   setosa 0.9492819
3    c    rubra    nigra 0.5884522
4    d    minor   setosa 0.9501921
5    e    nigra bulbifer 0.9266531

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多