【问题标题】:data frame set value based on matching specific row name to column name基于将特定行名与列名匹配的数据框设置值
【发布时间】:2019-01-29 08:36:24
【问题描述】:

我想根据 R 数据帧中 rownamecolname 的特定匹配来设置值。我有行名(var1、var2、var3、var4 等)和列名(x-var1-t1、x-var2-t1、x-var1-t4、x-var3-t1、x-var3-t7等等)。行名需要与列名的第一个“x-varN”部分匹配。例如,var1 行名称应与 x-var1-t1 和 x-var1-t4 匹配。

所以这个数据框:

      x-var1-t1   x-var2-t1   x-var1-t4   x-var3-t1   x-var3-t7
var1          0           0           0           0           0
var2          0           0           0           0           0
var3          0           0           0           0           0
var4          0           0           0           0           0

会变成这样:

      x-var1-t1   x-var2-t1   x-var1-t4   x-var3-t1   x-var3-t7
var1          1           0           1           0           0
var2          0           1           0           0           0
var3          0           0           0           1           1
var4          0           0           0           0           0

执行此功能的最佳方法是什么?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以使用sapply 循环遍历dfrownames 并使用grepl 检查哪一列具有该行名称并将值转换为1。

    df[] <- t(sapply(rownames(df), function(x) as.numeric(grepl(x, colnames(df)))))
    df
    
    #     x.var1.t1 x.var2.t1 x.var1.t4 x.var3.t1 x.var3.t7
    #var1         1         0         1         0         0
    #var2         0         1         0         0         0
    #var3         0         0         0         1         1
    #var4         0         0         0         0         0
    

    或者按照@Dan Y 的建议,我们可以跳过匿名电话并通过以下方式使其更紧凑:

    df[] <- +t(sapply(rownames(df), grepl, colnames(df)))
    

    【讨论】:

      【解决方案2】:

      我们可以使用adist 来比较行名和列名。

       dat[] = +(!do.call(adist, c(partial = TRUE, dimnames(dat))))
       dat
           x.var1.t1 x.var2.t1 x.var1.t4 x.var3.t1 x.var3.t7
      var1         1         0         1         0         0
      var2         0         1         0         0         0
      var3         0         0         0         1         1
      var4         0         0         0         0         0
      

      这相当于:

        (adist(rownames(dat),colnames(dat),partial=TRUE)==0)+0
      

      我添加0 的原因是将其从逻辑更改为数字。您可以使用*1。这些只是身份。 adistpartial=TRUE 等效于 agrep

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2017-10-18
        • 1970-01-01
        • 2020-08-03
        相关资源
        最近更新 更多