将数字索引添加到R中另一列中每个唯一值的行中

将数字索引添加到R中另一列中每个唯一值的行中,r,dplyr,R,Dplyr,你好,我有一个数据帧,比如 Names;Sp Unknown;SP1 Unknown;SP1 Unknown;SP1 Unknown;SP2 Unknown;SP2 Unknown;SP3 Unknown;SP4 OK;SP4 OK;SP5 Unknown;SPA Unknown;SPB Unknown;SP1 我想为每个未知df$Names和每个df$Sp添加一个\u编号 以下是所需的输出: Names;Sp Unknown_1;SP1 Unknown_1;SP1 Unknown_1;S

你好,我有一个数据帧,比如

Names;Sp 
Unknown;SP1
Unknown;SP1
Unknown;SP1
Unknown;SP2
Unknown;SP2
Unknown;SP3
Unknown;SP4
OK;SP4
OK;SP5
Unknown;SPA
Unknown;SPB
Unknown;SP1
我想为每个未知
df$Names
和每个
df$Sp
添加一个
\u编号

以下是所需的输出:

Names;Sp 
Unknown_1;SP1
Unknown_1;SP1
Unknown_1;SP1
Unknown_2;SP2
Unknown_2;SP2
Unknown_3;SP3
Unknown_4;SP4
OK;SP4
OK;SP5
Unknown_5;SPA
Unknown_6;SPB
Unknown_1;SP1
这是数据

structure(list(Names = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 2L, 2L, 2L), .Label = c("OK", "Unknown"), class = "factor"), 
    Sp = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 5L, 6L, 
    7L, 1L), .Label = c("SP1", "SP2", "SP3", "SP4", "SP5", "SPA", 
    "SPB"), class = "factor")), class = "data.frame", row.names = c(NA, 
-12L))

使用
data.table
包,您可以按如下方式解决问题(假设您的
data.frame
名为
df
):


另一种
数据。表
方法:

library(data.table)
setDT(df)[Names == "Unknown", 
          Names := paste(Names, match(Sp, unique(Sp)), sep = '_')]
df

#        Names  Sp
# 1: Unknown_1 SP1
# 2: Unknown_1 SP1
# 3: Unknown_1 SP1
# 4: Unknown_2 SP2
# 5: Unknown_2 SP2
# 6: Unknown_3 SP3
# 7: Unknown_4 SP4
# 8:        OK SP4
# 9:        OK SP5
#10: Unknown_5 SPA
#11: Unknown_6 SPB
#12: Unknown_1 SP1
dplyr
翻译不是很漂亮:

library(dplyr)

df %>%
  filter(Names == 'Unknown') %>%
  mutate(Names = paste(Names, match(Sp, unique(Sp)), sep = '_')) %>%
  bind_rows(df %>% filter(Names != 'Unknown')) 

你能发布你想要的输出吗?您好,想要的输出是最后一个数据帧(我通过添加标题编辑)您好,thanl you,我只是想知道在OK名称中添加了一个“uu”吗?哦,对不起,我没有注意到,我可以稍微更新代码来更改它。顺便问一下,跳过未知的_5有关系吗?我的解决方案有点太快了……不,因为目标的值不同,所以okI更新了我的答案,以解决不必要的问题。此外,它现在不会跳过5。感谢您的帮助,它现在可以工作了:)
library(data.table)
setDT(df)[Names == "Unknown", 
          Names := paste(Names, match(Sp, unique(Sp)), sep = '_')]
df

#        Names  Sp
# 1: Unknown_1 SP1
# 2: Unknown_1 SP1
# 3: Unknown_1 SP1
# 4: Unknown_2 SP2
# 5: Unknown_2 SP2
# 6: Unknown_3 SP3
# 7: Unknown_4 SP4
# 8:        OK SP4
# 9:        OK SP5
#10: Unknown_5 SPA
#11: Unknown_6 SPB
#12: Unknown_1 SP1
library(dplyr)

df %>%
  filter(Names == 'Unknown') %>%
  mutate(Names = paste(Names, match(Sp, unique(Sp)), sep = '_')) %>%
  bind_rows(df %>% filter(Names != 'Unknown'))