我使用了回复上一个问题的用户的R代码(请参阅此处:Split values of a column in a data frame by specific tag and add them as extra row) 实现以下目标:
df <- data.frame(var1 = c("A", "B", "C", "D", "E"),
var2 = c("test", "5 | 6", "X & Y", "M | N | O", "none"))
> df
var1 var2
1 A test
2 B 5 | 6
3 C X & Y
4 D M | N | O
5 E none
t1 <- c("", "|")[df$var1 %in% df$var1[grep("\\|", df$var2)]+1]
t2 <- c("", "&")[df$var1 %in% df$var1[grep("&", df$var2)]+1]
t1[which(t2 == "&")] <- "&"
df$var3 <- t1
> df
var1 var2 var3
1 A test
2 B 5 | 6 |
3 C X & Y &
4 D M | N | O |
5 E none
我只是想知道是否有更好的方法,因为我真的想改进我的R编码方式。对我来说,这不是一个简单的任务,但我愿意学习: - )
答案 0 :(得分:2)
假设您的数据确实非常有条理,间距适当等,您可以使用gsub
和substring
。
df$var3 = substring(gsub("([a-zA-Z0-9 ])", "", df$var2), 1, 1)
df
# var1 var2 var3
# 1 A test
# 2 B 5 | 6 |
# 3 C X & Y &
# 4 D M | N | O |
# 5 E none
substring
(或substr
)与start
和stop
一起用作1
。假设var2
中可能有不同的标点符号,更常规的方法是:
gsub("[^[:punct:]]", "", df$var2)
# [1] "" "|" "&" "||" ""
同样,使用substr
将允许您只选择每个字符串中的第一个字符。
substr(gsub("[^[:punct:]]", "", df$var2), 1, 1)
# [1] "" "|" "&" "|" ""
如果您肯定只有这两个分隔字符,则可以将搜索模式从[^[:punct:]]
更改为[^\\||\\&]
。
在此更新的示例中,^
(在方括号内)表示匹配所有但这些字符。
答案 1 :(得分:1)
您可以改用:
t3 <- rep("",length(df$var1))
t3[which(grepl("&",df$var2))] <- "&"
t3[which(grepl("\\|",df$var2))] <- "|"
df$var3 <- t3
答案 2 :(得分:0)
grepl("\\|",df$var2)
grepl("&",df$var2)
与
相同df$var1 %in% df$var1[grep("\\|", df$var2)]
df$var1 %in% df$var1[grep("&", df$var2)]+1
所以你可以使用例如
ifelse(grepl("\\|",df$var2),'|','')
ifelse(grepl("&",df$var2),'&','')
答案 3 :(得分:0)
我找到了另一种解决方案,它对我来说只对一行很有用: - )
library(stringr)
df$var3 <- str_extract(df$var2, "\\||&")
但是,我不得不说我不关心代码添加到没有匹配的地方。
感谢您提供所有解决方案!确实很棒!