【问题标题】:Mutate only applies to the value of the first column变异只适用于第一列的值
【发布时间】:2019-10-14 07:01:30
【问题描述】:

我正在尝试从列的值中删除一个子字符串,我的数据看起来像这样:

LBL       Var1      Var2
name1       1        12
name1_A     1        13
name1_B     2        10
name2       1        11
name2_A     2        10
name2_B     3        9

我已经创建了一个适用于单个字符串的函数,但是当我尝试改变数据框时,它会显示第一行的结果并且不适用于其余行。我做错了什么?

这是我目前创建的函数:

remExt <- function(x){
  y <- str_split_fixed(x,"_",2)
  return(y[1])
}

我已经尝试过使用单个字符串的函数,并且效果很好:

string1 <- "Yes_No"

res <- remExt(string1)
print(res)

[1]“是”

我按照以下说明尝试变异:

df %>% mutate(newLBL = remExt(df$LBL))

我得到以下结果:

LBL       Var1      Var2   newLBL
name1       1        12    name1
name1_A     1        13    name1
name1_B     2        10    name1
name2       1        11    name1
name2_A     2        10    name1
name2_B     3        9     name1

我的预期结果是:

LBL       Var1      Var2   newLBL
name1       1        12    name1
name1_A     1        13    name1
name1_B     2        10    name1
name2       1        11    name2
name2_A     2        10    name2
name2_B     3        9     name2

但似乎无法让它工作,有什么想法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您只从y 中获取第一个元素,您想要y[,1] 的第一列:

    remExt <- function(x){
      y <- str_split_fixed(x,"_",2)
      return(y[,1])
    }
    
    df %>% mutate(newLBL = remExt(LBL))
          LBL Var1 Var2 newLBL
    1   name1    1   12  name1
    2 name1_A    1   13  name1
    3 name1_B    2   10  name1
    4   name2    1   11  name2
    5 name2_A    2   10  name2
    6 name2_B    3    9  name2
    

    还要注意mutate,您不需要使用$ 提取列

    编辑:

    更简单的实现是使用str_removestr_replace。以下两者是等价的:

    df %>% mutate(newLBL = str_replace(LBL,"\\_.",""))
    
    df %>% mutate(newLBL = str_remove(LBL,"\\_."))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多