是否有一个R函数来选择特定的行号?

wrrgggsh  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(77)

我是学习R的初学者,我有一个包含书名和作者的数据集,我用它来练习清理数据。在这个过程的一部分,我想把列“author”分成“first_name”和“last_name”。
当我执行此任务时,我得到以下消息:

library(tidyr)

#   - Seperate author first and last name
separate(df, col="author", into = c("first_name","last_name"), sep=" ")

Warning message:   
Expected 2 pieces. Additional pieces discarded in
18 rows [4, 12, 16, 17, 21, 23, 28, 34, 41, 43, 46, 60, 65, 67, 73,
79, 82, 84].

回头看看数据,我可以看到错误主要发生在有中间名或中间名首字母的作者身上(例如。路易莎梅奥尔科特)。我想查找警告消息中所述的行,以便在清理之前删除额外的空间。有没有办法做到这一点?
我尝试使用

df[4,12,16,17,21,23,28,34,41,43,36,60,65,67,73,79,82,84]

但是我得到了一个错误消息,因为R试图将它们作为列拉出来,而数据集没有那么多列。我已经浏览了一些搜索板,寻找执行此任务所需的代码,但我遇到的解决方案并不完全适用于这个问题,而且似乎比他们需要的更多。
有没有一个简单的方法来解决这个问题?或者我应该以不同的方式来处理数据?

5ssjco0h

5ssjco0h1#

扩展我的评论,这里有一个例子来说明我的意思:

library(dplyr)

df <- data.frame(name = c("Jane Doe", "Louisa May Alcot")) 

df |>
  mutate(last_name = sub(".*\\s", "", name),
         first_name = sub("(.*)\\s(.*)$", "\\1", name))

#               name last_name first_name
# 1         Jane Doe       Doe       Jane
# 2 Louisa May Alcot     Alcot Louisa May

使用正则表达式,我们可以捕获最后一个空格(last_name)之后的所有内容和最后一个空格(first name)之前的所有内容。在某些情况下,这将不起作用,例如“文森特货车高”。这里有一个空格在姓氏中--只是在使用这个时要注意的一些事情。
我认为separate在使用一致的分隔符时工作得很好,但这里有些人有三个空格,而另一些人只有两个。你仍然可以用这样的逻辑来强迫它:

library(dplyr)
library(tidyr)

df |>
  separate(name, into = c("first", "middle", "last")) |>
  mutate(last = coalesce(last, middle),
         middle = ifelse(last == middle, "", middle),
         first = trimws(paste(first, middle))) |>
  select(-middle)

最后,如果你在你的帖子中提到,在这种情况下删除空间是有意义的,你可以这样做:

library(stringr)
library(tidyr)

df |>
  mutate(name = ifelse(str_count(name, "\\s") > 1, str_remove(name, "\\s"), name)) |>
  separate(name, into = c("first", "last"))
#       first  last
# 1      Jane   Doe
# 2 LouisaMay Alcot

相关问题