在r中用逗号拆分和重新排序字符串
splitting and reordering character string by comma in r
我有几年的个人数据,但他们的名字每年都有不同的格式。一半的名字已经按 "First Last" 顺序排列,但我不知道如何成功编辑另一半 ("Last, First")。
这是一个样本 df:
name <- c("First1 Last1","Last2, First2", "Last3, First3", "First4 Last4", "First5 Last5")
salary <-c(51000, 72000,125000,67000,155000)
year <-c(2012,2014,2013,2013,2014)
df <- data.frame(name, salary, year, stringsAsFactors=FALSE)
以下是我尝试过的方法:用逗号分隔文本:
df$name2 <- strsplit(df$name, ", ") #to split the character string by comma
df$name3 <-paste(df$name2, collapse=" ") #to collapse the newly created vectors back into a string
df$name4 <-paste(rev(df$name2)) #to try pasting each vector in reverse order
df$name5 <-paste(rev(df$name2)[2:1]) #trying again...
我已经打印了正确的名称,但倒退了,并将它们打印在错误的行上,但是尽管进行了所有谷歌搜索,我还是无法使其正常工作。我做错了什么?
您可以使用正则表达式:
df$name <- sub("(L[A-Za-z0-9]+).*\s+(F[A-Za-z0-9]+).*","\2 \1",df$name)
# df
# name salary year
# 1 First1 Last1 51000 2012
# 2 First2 Last2 72000 2014
# 3 First3 Last3 125000 2013
# 4 First4 Last4 67000 2013
# 5 First5 Last5 155000 2014
代码查找以大写字母 L 开头的单词,后跟一些字母/数字,然后是一些符号,space,然后是一个以大写字母 F 开头的单词,一些字母/数字和然后是一些符号。
然后它重新排序这两个单词,首先是一个以 F 开头的单词(即 (F[A-Za-z0-9]+)
),然后是一个以 L 开头的单词(即 (L[A-Za-z0-9]+)
)。
如您所见,代码删除了逗号(这似乎是您想要的输出)。
根据新信息,使用代码:
df$name <- sub('(.*)\,\s+(.*)','\2 \1', df$name)
# sub('(.*)\,\s+(.*)','\2 \1',name)
# [1] "John Smith" "Marcus Green" "Mario Sanchez" "Jennifer Roberts" "Sammy Lee"
在这里,我们要查找逗号前的字符,然后是 space,然后是其他字符。然后我们重新排序第一组和第二组以获得所需的输出。
注意:我假设如果没有逗号,那么名称的顺序已经正确(您的评论中似乎就是这种情况)。
我想这就是你想要的。你真的很接近,你需要 rev
和 paste(..., collapse = " ")
。我也 trim 空格,但这可能不是必需的。
# look for commas to see which rows need fixing
needs_rearranging = grep(",", df$name)
df$name[needs_rearranging] =
# split on the comma space, then
sapply(strsplit(df$name[needs_rearranging], split = ", "),
function(x) {
# remove whitespace, reverse the order, and
# paste them back together
paste(rev(trimws(x)), collapse = " ")
})
df
# name salary year
# 1 First1 Last1 51000 2012
# 2 First2 Last2 72000 2014
# 3 First3 Last3 125000 2013
# 4 First4 Last4 67000 2013
# 5 First5 Last5 155000 2014
我有几年的个人数据,但他们的名字每年都有不同的格式。一半的名字已经按 "First Last" 顺序排列,但我不知道如何成功编辑另一半 ("Last, First")。
这是一个样本 df:
name <- c("First1 Last1","Last2, First2", "Last3, First3", "First4 Last4", "First5 Last5")
salary <-c(51000, 72000,125000,67000,155000)
year <-c(2012,2014,2013,2013,2014)
df <- data.frame(name, salary, year, stringsAsFactors=FALSE)
以下是我尝试过的方法:用逗号分隔文本:
df$name2 <- strsplit(df$name, ", ") #to split the character string by comma
df$name3 <-paste(df$name2, collapse=" ") #to collapse the newly created vectors back into a string
df$name4 <-paste(rev(df$name2)) #to try pasting each vector in reverse order
df$name5 <-paste(rev(df$name2)[2:1]) #trying again...
我已经打印了正确的名称,但倒退了,并将它们打印在错误的行上,但是尽管进行了所有谷歌搜索,我还是无法使其正常工作。我做错了什么?
您可以使用正则表达式:
df$name <- sub("(L[A-Za-z0-9]+).*\s+(F[A-Za-z0-9]+).*","\2 \1",df$name)
# df
# name salary year
# 1 First1 Last1 51000 2012
# 2 First2 Last2 72000 2014
# 3 First3 Last3 125000 2013
# 4 First4 Last4 67000 2013
# 5 First5 Last5 155000 2014
代码查找以大写字母 L 开头的单词,后跟一些字母/数字,然后是一些符号,space,然后是一个以大写字母 F 开头的单词,一些字母/数字和然后是一些符号。
然后它重新排序这两个单词,首先是一个以 F 开头的单词(即 (F[A-Za-z0-9]+)
),然后是一个以 L 开头的单词(即 (L[A-Za-z0-9]+)
)。
如您所见,代码删除了逗号(这似乎是您想要的输出)。
根据新信息,使用代码:
df$name <- sub('(.*)\,\s+(.*)','\2 \1', df$name)
# sub('(.*)\,\s+(.*)','\2 \1',name)
# [1] "John Smith" "Marcus Green" "Mario Sanchez" "Jennifer Roberts" "Sammy Lee"
在这里,我们要查找逗号前的字符,然后是 space,然后是其他字符。然后我们重新排序第一组和第二组以获得所需的输出。
注意:我假设如果没有逗号,那么名称的顺序已经正确(您的评论中似乎就是这种情况)。
我想这就是你想要的。你真的很接近,你需要 rev
和 paste(..., collapse = " ")
。我也 trim 空格,但这可能不是必需的。
# look for commas to see which rows need fixing
needs_rearranging = grep(",", df$name)
df$name[needs_rearranging] =
# split on the comma space, then
sapply(strsplit(df$name[needs_rearranging], split = ", "),
function(x) {
# remove whitespace, reverse the order, and
# paste them back together
paste(rev(trimws(x)), collapse = " ")
})
df
# name salary year
# 1 First1 Last1 51000 2012
# 2 First2 Last2 72000 2014
# 3 First3 Last3 125000 2013
# 4 First4 Last4 67000 2013
# 5 First5 Last5 155000 2014