突变仅适用于第一列的值

时间:2019-05-28 17:37:11

标签: r mutate

我正在尝试从列的值中删除子字符串,我的数据如下所示:

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]“是”

我按照以下说明尝试mutate:

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

但是似乎无法正常工作,有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您仅从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,"\\_."))