如何更正列中的拼写错误并将值折叠到 R 中的正确行中

How to correct misspelling in column and collapse values into correct row in R

我是 R 的新手,正在努力整理数据。我有一个问题,我找不到答案,但也许我搜索的词有误。

我有一个 table (df_samples),格式如下:

species gender group sample1 sample2 sample n
penguin m i. 20 21 n
penguin f i. NA 18 n
lion m ii. 5 4 n
lion f ii. 2 9 n
penguin f ii. 22 NA n
tiger m ii. 7 6 n
tiger f ii. 6 8 n

现在,这里的问题是第二组的企鹅。这是错误的,应该是我。在我的 table 中有数百个不同的物种和样本。我在几行中都遇到了这个问题,其中物种组错误。

我能够使用以下代码找到有问题的特定行:

n_occur <- data.frame(table(df_samples$species))
df_samples_2 <- df_samples[df_samples$species %in% n_occur$Var1[n_occur$Freq > 2],]

这给了我有问题的行,我可以在自己的数据框中查看它们。在那里我可以识别出有错误的行并可以更正它们。但是我遇到了两个问题。

首先我不知道如何索引有问题的值以直接在我的原始数据框中更改它。

其次,我不知道如何将错误行中存储的数据带到“正确”行。

我敢肯定,网络上有答案,但我真的很难以某种方式表达我的问题,这样我就可以找到它们。

如果有人能够提供帮助,请指出如何搜索或解决问题,我将不胜感激。

有几种方法。

假设所有物种都属于同一组

如果所有物种都属于同一个组,则可以使用存储speciesgroup信息的向量来替换当前组。

同样,这将替换相同 species.

中的 ALL group

基础 R

correct_group <- c("penguin" = "i.", "tiger" = "ii.", "lion" = "ii.")

df$group <- correct_group[match(df$species, names(correct_group))]

dplyr

library(dplyr)

df %>% mutate(group = correct_group[match(species, names(correct_group))])

如果您是手工操作:

如果物种不属于同一组,我们也可以一个一个地做(前提是你有几条记录要改)。

首先确定行索引,其中 species 是“penguin”,group 是“ii.”。这是您要更改的记录。然后只需将 group 值替换为 "i.".

基础 R

df[which(df$species == "penguin" & df$group == "ii."), "group"] <- "i."

dplyr

library(dplyr)

df %>% mutate(group = ifelse(species == "penguin" & group == "ii.", "i.", group))

输出

以上所有方法产生相同的输出。

species gender group sample1 sample2 sample.n
1 penguin      m    i.      20      21        n
2 penguin      f    i.      NA      18        n
3    lion      m   ii.       5       4        n
4    lion      f   ii.       2       9        n
5 penguin      f    i.      22      NA        n
6   tiger      m   ii.       7       6        n
7   tiger      f   ii.       6       8        n

记住dplyr方法,你必须将df“保存”回它(df <- df %>% dplyr::method),否则,它只会输出将结果发送到控制台,而无需实际更改任何内容。

使用您的流程,您可以尝试以下步骤。

为行添加唯一 ID,以便以后过滤。

df_samples<-df_samples %>% 
  rowid_to_column()

根据 df_samples_2

中的 rowid 从 df_samples 中删除问题行
df_samples<-df_samples[-df_samples_2$rowid,]

根据您的要求更新 df_samples_2,根据 rowid 逐行变化。

将更正的行合并回 df_samples

df_samples<-bind_rows(df_samples,df_samples_2)

此外,如果您的最终目标和数据如上所述,您也可以在原始 df_samples

上尝试
df_samples <-df_samples %>% 
  group_by(species) %>%  #this will create internal groups
  arrange(species,group) %>%  # Will ensure i. will be before ii.
  mutate(group=lag(group,default=first(group))) # lag() will copy earlier row values to current row per group.