【问题标题】:matching id inside data frame匹配数据框内的id
【发布时间】:2016-11-27 16:59:29
【问题描述】:

我制作了这个简单的数据框以使我的问题更清楚:

id = c(11, 12, 13, 14, 15) 
referenceperson = c("yes", "no", "yes", "no", "yes") 
smoke = c(3, 4, 3, NA, 2) 
spouseid = c(12, 11, NA, 15, 14) 
dataframe = data.frame(id, referenceperson , smoke, spouseid)

我想只获得参考人的配偶的吸烟量,在这个例子中,第一次观察的值为 4。

我迷路了,感谢您的帮助

【问题讨论】:

  • 使用match,即with(dataframe, smoke[match(id[1], spouseid)])#[1] 4

标签: r indexing matching


【解决方案1】:

仅使用 dataframe 对象中的值,将逐步执行它并提供一种紧凑的方法来获取您要求的单个值,然后是所有值:

> dataframe[ match(dataframe$spouseid[1], data.frame$id) , 'smoke']
[1] 4

这是首先获取人的配偶的索引并使用它来获取引用行中的'smoke'值的方法。下一行演示 match 将为您获取所有此类索引,并且它们不存在的地方将返回 NA。

> match(dataframe$spouseid, dataframe$id)
[1]  2  1 NA  5  4

在 R 中,使用 NA 作为数据帧的索引将返回 NA,而不是 null 值。这保留了序列信息。因此,您可以通过以下方式获得配偶的所有吸烟值:

> dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke']
[1]  4  3 NA  2 NA

然后将这些值分配给数据框中的一列。

> dataframe$smk_stat_spouse <- 
                    dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke']
> dataframe
  id referenceperson smoke spouseid smk_stat_spouse
1 11             yes     3       12               4
2 12              no     4       11               3
3 13             yes     3       NA              NA
4 14              no    NA       15               2
5 15             yes     2       14              NA

【讨论】:

    【解决方案2】:

    我相信我找到了解决方案,虽然它很混乱(我是 r 新手)

    df1 <- cbind(id, referenceperson)
    df1 <- as.data.frame(df1)
    
    df2 <- cbind(spouseid, smoke)
    df2 <- as.data.frame(df2)
    
    matched <- df2$smoke[match(df1$id, df2$spouseid) ]
    
    refp <- ifelse(referenceperson=="yes", 1, referenceperson)
    refp <- ifelse(refp=="no", NA, refp)
    refp <- as.numeric(refp)
    refp*matched
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多