【问题标题】:Replace all values in column of one dataframe using values in row of another dataframe (matching by row name&column name), replacement is characters使用另一个数据框的行中的值替换一个数据框的列中的所有值(按行名和列名匹配),替换为字符
【发布时间】:2017-12-14 02:33:29
【问题描述】:

这与帖子“Replace all values in a column of one dataframe using values in a row of another dataframe (matching by row name and column name)”非常相似

除了我的替换要求是那些(“1”)被替换为所在列的名称。

示例设置

df1<-data.frame(replicate(5,sample(0:1,5,rep=TRUE)))
row.names(df1)<-c("hootsuite","foodtank","FarmsNews","agchat","TysonFoods")
names(df1)<-c("food","agvocate","editor","gmo","ag")

           food agvocate editor gmo ag
hootsuite     1        1      0   0  1
foodtank      1        1      0   0  1
FarmsNews     1        0      1   0  1
agchat        0        0      0   0  1
TysonFoods    1        0      1   1  0

会变成

                food    agvocate    editor gmo      ag
hootsuite       food    agvocate    0       0       ag
foodtank        food    agvocate    0       0       ag
FarmsNews       food    0           editor  0       ag
agchat          0       0           0       0       ag
TysonFoods      food    0           editor  gmo     0

similar post中的解决方案

df1*df2[,1][col(df1)] 
or  
sweep(df1, 2, df2[,1], "*")

(使用下面定义的 df2)

df2<-c("food","agvocate","editor","gmo","ag")
df2<-as.matrix(df2)
row.names(df2)<-c("food","agvocate","editor","gmo","ag") 

给出一个错误“FUN(left, right) 中的错误:二元运算符的非数字参数”,这意味着矩阵乘法确实不适用于字符;)

那么我应该采取的方法是什么?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以使用Mapreplace 对应列的值为1 的列名

    df1[] <- Map(function(x, y) replace(x, x==1, y), df1, names(df1))
    df1
    #           food agvocate editor gmo ag
    #hootsuite  food agvocate      0   0 ag
    #foodtank   food agvocate      0   0 ag
    #FarmsNews  food        0 editor   0 ag
    #agchat        0        0      0   0 ag
    #TysonFoods food        0 editor gmo  0
    

    或者使用逻辑矩阵进行子集化和赋值

    df1[df1==1] <- names(df1)[col(df1)][df1==1]
    

    【讨论】:

      【解决方案2】:

      使用purrr 包的解决方案。 map2_dfc 可以使用函数循环遍历两个列表或向量(在本例中为 df1names(df1))。它还可以将输出绑定为数据框。

      set.seed(1)
      
      df1<-data.frame(replicate(5,sample(0:1,5,rep=TRUE)))
      row.names(df1)<-c("hootsuite","foodtank","FarmsNews","agchat","TysonFoods")
      names(df1)<-c("food","agvocate","editor","gmo","ag")
      
      library(purrr)
      
      df2 <- map2_dfc(df1, names(df1), function(x, y){
        x[x %in% 1] <- y
        return(x)
      })
      df2
      # # A tibble: 5 x 5
      #    food agvocate editor   gmo    ag
      #   <chr>    <chr>  <chr> <chr> <chr>
      # 1     0 agvocate      0     0    ag
      # 2     0 agvocate      0   gmo     0
      # 3  food agvocate editor   gmo    ag
      # 4  food agvocate      0     0     0
      # 5     0        0 editor   gmo     0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-28
        • 2019-07-22
        • 1970-01-01
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多