变异只适用于第一列的值
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_remove
或str_replace
。以下两者是等价的:
df %>% mutate(newLBL = str_replace(LBL,"\\_.",""))
df %>% mutate(newLBL = str_remove(LBL,"\\_."))
【讨论】:
以上是关于变异只适用于第一列的值的主要内容,如果未能解决你的问题,请参考以下文章