我有一个数据框如下:
+-----+-------+
| V1 | V2 |
+-----+-------+
| 1 | a,b,c |
| 2 | a,c |
| 3 | b,d |
| 4 | e,f |
| . | . |
+-----+-------+
Run Code Online (Sandbox Code Playgroud)
每个字母表都是用逗号分隔的字符.我想在每个逗号上拆分V2并将拆分字符串作为新行插入.例如,所需的输出将是:
+----+----+
| V1 | V2 |
+----+----+
| 1 | a |
| 1 | b |
| 1 | c |
| 2 | a |
| 2 | c |
| 3 | b |
| 3 | d |
| 4 | …Run Code Online (Sandbox Code Playgroud) 我有一个包含文本字符串的对象:
x <- "xxyyxyxy"
Run Code Online (Sandbox Code Playgroud)
我想把它拆分成一个向量,每个元素包含两个字母:
[1] "xx" "yy" "xy" "xy"
Run Code Online (Sandbox Code Playgroud)
看起来strsplit应该是我的票,但由于我没有正则表达式foo,我无法弄清楚如何使这个功能将字符串按照我想要的方式切成块.我该怎么做?
我可以使用循环解决这个问题,但我正在尝试在向量中思考,所以我的代码将更多R-esque.
我有一个名单.格式为firstname_lastname.我想从这个列表中删除一个只有名字的单独列表.我似乎无法理解如何做到这一点.这是一些示例数据:
t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
tsplit <- strsplit(t,"_")
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
> tsplit
[[1]]
[1] "bob" "smith"
[[2]]
[1] "mary" "jane"
[[3]]
[1] "jose" "chung"
[[4]]
[1] "michael" "marx"
[[5]]
[1] "charlie" "ivan"
Run Code Online (Sandbox Code Playgroud)
我可以使用这样的循环得到我想要的东西:
for (i in 1:length(tsplit)){
if (i==1) {t_out <- tsplit[[i]][1]} else{t_out <- append(t_out, tsplit[[i]][1])}
}
Run Code Online (Sandbox Code Playgroud)
这会给我这个:
t_out
[1] "bob" "mary" "jose" "michael" "charlie"
Run Code Online (Sandbox Code Playgroud)
那么我怎么能没有循环呢?
这有效
x <- "0.466:1.187:2.216:1.196"
y <- as.numeric(unlist(strsplit(x, ":")))
Run Code Online (Sandbox Code Playgroud)
blat$LRwAvg所有的值都X如上所示,但这不起作用
for (i in 1:50){
y <- as.numeric(unlist(strsplit(blat$LRwAvg[i], "\\:")))
blat$meanLRwAvg[i]=mean(y)
}
Run Code Online (Sandbox Code Playgroud)
因为:
strsplit中的错误(blat $ LRwAvg [i],"\:"):非字符参数
如果我有一个,两个或空反斜杠并不重要.
我的问题是什么?(一般情况下,我的意思是在这项特殊任务中,技术上)
我有以下字符串:
[1] "10012 ---- ---- ---- ---- CAB UNCH CAB"
Run Code Online (Sandbox Code Playgroud)
我希望通过间隙来分割这个字符串,但是间隙具有可变数量的空格.有没有办法使用strsplit()函数来分割这个字符串并返回一个已删除所有间隙的8个元素的向量?
一行代码是首选.
常识和使用健全性检查gregexpr()表明,下面的后视和前瞻断言应该恰好在以下位置匹配testString:
testString <- "text XX text"
BB <- "(?<= XX )"
FF <- "(?= XX )"
as.vector(gregexpr(BB, testString, perl=TRUE)[[1]])
# [1] 9
as.vector(gregexpr(FF, testString, perl=TRUE)[[1]][1])
# [1] 5
Run Code Online (Sandbox Code Playgroud)
strsplit()但是,使用这些匹配位置的方式不同,testString在使用lookbehind断言时在一个位置分割,但在使用前瞻断言时在两个位置 - 第二个看起来不正确 - .
strsplit(testString, BB, perl=TRUE)
# [[1]]
# [1] "text XX " "text"
strsplit(testString, FF, perl=TRUE)
# [[1]]
# [1] "text" " " "XX text"
Run Code Online (Sandbox Code Playgroud)
我有两个问题:(Q1)这里发生了什么?并且(Q2)如何才能strsplit()更好地表现?
更新: Theodore Lytras的优秀答案解释了发生了什么,以及地址(Q1).我的答案建立在他的基础上,以确定一个补救措施,解决(Q2) …
我想将其后的字符串拆分为句点.我试着strsplit()用"."的split说法,但没有得到我想要的结果.
s <- "I.want.to.split"
strsplit(s, ".")
[[1]]
[1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Run Code Online (Sandbox Code Playgroud)
我想要的输出是s在列表中拆分为4个元素,如下所示.
[[1]]
[1] "I" "want" "to" "split"
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我想编写一个strsplit命令来抓取第一个")"并拆分字符串.
例如:
f("12)34)56")
"12" "34)56"
Run Code Online (Sandbox Code Playgroud)
我已经阅读了其他几个相关的正则表达式问题,但我担心我无法做出这样的正面或反面.谢谢你的任何帮助.
R中的strsplit函数是什么,匹配并删除给定的正则表达式以将字符串的其余部分拆分为向量.
>strsplit("abc123def", "[0-9]+")
[[1]]
[1] "abc" "" "" "def"
Run Code Online (Sandbox Code Playgroud)
但是我应该如何使用正则表达式以相同的方式拆分字符串,还要保留匹配?我需要以下内容.
>FUNCTION("abc123def", "[0-9]+")
[[1]]
[1] "abc" "123" "def"
Run Code Online (Sandbox Code Playgroud)
使用strapply("abc123def","[0-9] + | [az] +")在这里工作,但如果正则表达式无法捕获除匹配之外的其余字符串怎么办?
我有一个包含一列字符串的数据框,并希望将这些字符串的子字符串提取到一个新列中.
下面是一些示例代码和数据,显示我想在id列中的最后一个下划线字符后面获取字符串以创建new_id列.该id列条目总是有2个下划线它总是最后子,我想.
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
require(dplyr)
df = df %>% dplyr::mutate(new_id = strsplit(id, split="_")[[1]][3])
Run Code Online (Sandbox Code Playgroud)
我期待strsplit依次对每一行采取行动.
但是,该new_id列仅包含ABC在每一行中,而我想ABC在第1行和NHYK第2行中包含.您是否知道为什么会失败以及如何实现我想要的?