【问题标题】:Replace values in columns of a data frame after match a pattern in another column匹配另一列中的模式后替换数据框列中的值
【发布时间】:2020-09-10 03:53:20
【问题描述】:

如果同一列中的模式与所需的模式不同,是否有一种直观的方法来替换数据框的两列中的值?具体来说,我的数据框如下所示:

   Col1              Value1      Value2        
   my_HD_SAMPLE      34          0.34        
   my_HD_T_SAMPLE    6           0.6           
   my_BD_NAME        94          0.94      
   my_LE_NAME        1           0.1  
   my_TS_SAMPLE      74          0.74                 

如果 Col1 中的行与模式 BD|HD 不匹配,我想将第 2 列和第 3 列中的值替换为 0。期望的输出应该是:

   Col1              Value1     Value2        
   my_HD_SAMPLE      34         0.34        
   my_HD_T_SAMPLE    6          0.6           
   my_BD_NAME        94         0.94      
   my_LE_NAME        0          0  
   my_TS_SAMPLE      0          0                 

我试过这个:

mydf = mydf$"Col1"[!grepl('BD|HD',mydf$"Col1")] <- 0

我收到了这条警告信息:

In [<-.factor`(`*tmp*`, !grepl("BD|HD", mydf$Col1), value = c(`NA` = NA,  :
  invalid factor level, NA generated

我该如何解决这个问题?

【问题讨论】:

  • 表示mydf$"Col1""factor" 类的变量,而"0" 不是该因素的级别。尝试levels(mydf$"Col1") &lt;- c("0", levels(mydf$"Col1"))` 或将变量转换为as.character
  • 试试mydf[!grepl('BD|HD',mydf$"Col1"),2:3] &lt;- 0。确保 Value1 和 Value2 是数字。

标签: r


【解决方案1】:

在我看来,Col1 是一个因素。试试:

# Convert to character first.
rows <- !grepl("BD|HD", as.character(mydf$`Col1`))
mfdf$`Value1`[rows] <- 0
mfdf$`Value2`[rows] <- 0

【讨论】:

    【解决方案2】:

    试试这个

    mydf[!grepl('BD|HD',mydf$"Col1"),][2:ncol(mydf)] <- 0
    
    > mydf
                Col1 Value1 Value2
    1   my_HD_SAMPLE     34   0.34
    2 my_HD_T_SAMPLE      6   0.60
    3     my_BD_NAME     94   0.94
    4     my_LE_NAME      0   0.00
    5   my_TS_SAMPLE      0   0.00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 2021-03-05
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多