【问题标题】:Compare variable names with String to compute new variable将变量名称与字符串进行比较以计算新变量
【发布时间】:2017-11-02 14:08:42
【问题描述】:

我想在 R 中使用变量名与 id-Variable 中的 String-Data 进行比较。

表 1 显示了我的示例表当前的外观,表 2 显示了我想要实现的目标。在表 2 中,如果变量 id 与列名匹配,则将相应的值复制到新变量“newid”中。其他值也被复制到新变量中以便于计算

id    a    b    c   newid

c     1    2    3   
a     4    2    1   
b     5    8    9   

id    a    b    c   newid   rest1   rest2

c     1    2    3   3       1       2
a     4    2    1   4       2       1
b     5    8    9   8       5       9

提前谢谢你

【问题讨论】:

    标签: r


    【解决方案1】:

    通过tidyverse的方法,

    library(tidyverse)
    
    df %>% 
     gather(var, val, -id) %>% 
     filter(id == var) %>% 
     left_join(df, ., by = 'id') %>% 
     select(-var)
    

    给出,

      id a b c val
    1  c 1 2 3   3
    2  a 4 2 1   4
    3  b 5 8 9   8
    

    【讨论】:

      【解决方案2】:

      使用match 并使用索引矩阵进行子集化:

      DF <- read.table(text = "id    a    b    c
      c     1    2    3   
      a     4    2    1   
      b     5    8    9 ", header = TRUE)
      
      DF$newid <- DF[, -1][cbind(seq_len(nrow(DF)), 
                                 match(DF$id, colnames(DF)[-1]))]
      #  id a b c newid
      #1  c 1 2 3     3
      #2  a 4 2 1     4
      #3  b 5 8 9     8
      

      【讨论】:

      • 是否有可能复制“新 id”变量后面的其他值(所以那些不适合 id 的值)以便我可以更轻松地计算?
      【解决方案3】:

      通过使用来自 reshape 的melt

      temp=with(melt(dt,'id'),melt(dt,'id')[id==variable,])
      dt$New=temp$value[match(dt$id,temp$variable)]
      dt
        id a b c New
      1  c 1 2 3   3
      2  a 4 2 1   4
      3  b 5 8 9   8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2015-08-14
        • 2018-05-01
        • 1970-01-01
        • 2015-10-03
        相关资源
        最近更新 更多