我正在尝试从列的值中删除子字符串,我的数据如下所示:
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
但是似乎无法正常工作,有什么想法吗?
答案 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_remove
或str_replace
。以下两项是等效的:
df %>% mutate(newLBL = str_replace(LBL,"\\_.",""))
df %>% mutate(newLBL = str_remove(LBL,"\\_."))