变异只适用于第一列的值

Posted

技术标签:

【中文标题】变异只适用于第一列的值【英文标题】: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

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

【问题讨论】:

【参考方案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,"\\_."))

【讨论】:

以上是关于变异只适用于第一列的值的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL如何把第二列的数据按照第一列数据排序,第二列的数据少于第一列

DT::DataTables 中第一列的黑色背景和白色字体

复选框仅适用于第一页 - 数据表、导轨

R语言中怎么把第一列的数据作为行名

delphi dbgrid 怎么才能只选中第一列

添加行时如何获取表列的值