首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有条件地将列中的子字符串值替换为其他列的子字符串

有条件地将列中的子字符串值替换为其他列的子字符串
EN

Stack Overflow用户
提问于 2018-06-20 16:53:38
回答 2查看 133关注 0票数 2

假设您有以下简单的dataframe:

代码语言:javascript
复制
Input <- c("X0_1-2 + X1_1-2","X0_1-2 + X1_1-2","X0_1-3 + X1_1-3","X0_3-2 + X1_3-2","X0_3-1 + X1_3-1","X0_2-1 + X1_2-1","X0_2-3 + X1_2-3","X0_13-1 + X1_13-1")
State1 <- c("1-3","1-3","1-2","3-1","3-2","2-1","2-1","13-3")
State2 <- c("1-2","1-2","1-3","3-2","3-1","2-3","2-3","13-1")
DataFrame <- cbind(Input,State1,State2)
DataFrame <- as.data.frame(DataFrame)

屈服

代码语言:javascript
复制
            Input State1 State2
1 X0_1-2 + X1_1-2    1-3    1-2
2 X0_1-2 + X1_1-2    1-3    1-2
3 X0_1-3 + X1_1-3    1-2    1-3
4 X0_3-2 + X1_3-2    3-1    3-2
5 X0_3-1 + X1_3-1    3-2    3-1
6 X0_2-1 + X1_2-1    2-1    2-3
7 X0_2-3 + X1_2-3    2-1    2-3
8 X0_13-1 + X1_13-1  13-3   13-1

我尝试了一种聪明的方法来添加一个与" Input“列相等的额外列,但是在"_”后面的值要么是State1的值,要么是State2的值,根据这些值与输入中相应的子字符串不同,也就是说,在这种情况下,期望的结果是

代码语言:javascript
复制
            Input State1 State2          Outcome
1 X0_1-2 + X1_1-2    1-3    1-2 X0_1-3 + X1_1-3
2 X0_1-2 + X1_1-2    1-3    1-2 X0_1-3 + X1_1-3
3 X0_1-3 + X1_1-3    1-2    1-3 X0_1-2 + X1_1-2
4 X0_3-2 + X1_3-2    3-1    3-2 X0_3-1 + X1_3-1
5 X0_3-1 + X1_3-1    3-2    3-1 X0_3-2 + X1_3-2
6 X0_2-1 + X1_2-1    2-1    2-3 X0_2-3 + X1_2-3
7 X0_2-3 + X1_2-3    2-1    2-3 X0_2-1 + X1_2-1
8 X0_13-1 + X1_13-1  13-3    13-1 X0_13-3 + X1_13-3

但到目前为止都没有成功。

的思想是用State1或State2的值替换输入字段中输入字段后面的任何值,两者以不同的.代替

如有任何意见或意见,将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 17:25:28

我会这样做,假设df是您的数据文件:

代码语言:javascript
复制
replacement <- c("State2","State1")[mapply(grepl, df$State2, df$Input)+1]
df$output <- sapply(1:nrow(df), function(i)gsub( "\\d+-\\d+",df[i, replacement[i]],df[i,"Input"]))

输出

代码语言:javascript
复制
> df
            Input State1 State2          output
1 X0_1-2 + X1_1-2    1-3    1-2 X0_1-3 + X1_1-3
2 X0_1-2 + X1_1-2    1-3    1-2 X0_1-3 + X1_1-3
3 X0_1-3 + X1_1-3    1-2    1-3 X0_1-2 + X1_1-2
4 X0_3-2 + X1_3-2    3-1    3-2 X0_3-1 + X1_3-1
5 X0_3-1 + X1_3-1    3-2    3-1 X0_3-2 + X1_3-2
6 X0_2-1 + X1_2-1    2-1    2-3 X0_2-3 + X1_2-3
7 X0_2-3 + X1_2-3    2-1    2-3 X0_2-1 + X1_2-1
8 X0_2-1 + X1_2-1    2-3    2-1 X0_2-3 + X1_2-3
票数 2
EN

Stack Overflow用户

发布于 2018-06-20 17:05:46

如果我正确理解,InputOutcome表示的状态对于字符串的"XO"部分和"X1"部分都是相同的。而且,State1State2从来都不一样。在这种情况下,您可以从输入中提取状态,将其与这两种状态中的一种进行比较,并将输出字符串粘贴到一起:

代码语言:javascript
复制
output <- ifelse(substring(DataFrame$Input, 13) == State1, State2, State1)
DataFrame$Outcome <- paste("X0_", output, " + X1_", output, sep = "")
DataFrame
#               Input State1 State2           Outcome
# 1   X0_1-2 + X1_1-2    1-3    1-2   X0_1-3 + X1_1-3
# 2   X0_1-2 + X1_1-2    1-3    1-2   X0_1-3 + X1_1-3
# 3   X0_1-3 + X1_1-3    1-2    1-3   X0_1-2 + X1_1-2
# 4   X0_3-2 + X1_3-2    3-1    3-2   X0_3-1 + X1_3-1
# 5   X0_3-1 + X1_3-1    3-2    3-1   X0_3-2 + X1_3-2
# 6   X0_2-1 + X1_2-1    2-1    2-3   X0_2-3 + X1_2-3
# 7   X0_2-3 + X1_2-3    2-1    2-3   X0_2-1 + X1_2-1
# 8 X0_13-1 + X1_13-1   13-3   13-1 X0_13-3 + X1_13-3

此解决方案适用于任意长度的"state“子字符串(例如,两个"1-1" and "201-14") expressed by the输入变量)。您可以使用regex,但在本例中,基于位置的提取是有效的(而且更有效)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50953379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档