【问题标题】:For value in Col 2, replace all values in Col 1 with first occurrence in Col 1对于 Col 2 中的值,将 Col 1 中的所有值替换为 Col 1 中的第一次出现
【发布时间】:2019-10-11 12:39:55
【问题描述】:

我正在清理一个大型数据集,第 1 列有几个公司名称的拼写。第 2 列中的公司 ID 在所有公司拼写中都是相同的,因此我想搜索公司 ID 并将所有公司拼写替换为第一个出现的拼写(哪个并不重要)。

我是 R 和 data.table 语法的新手,但尝试遍历公司 ID 并使用 setDT 替换公司名称值。但是,我无法弄清楚如何仅用公司名称拼写的第一个实例替换那些共享相同公司 ID 的公司。

这是我目前的位置:


library(data.table)

#Sample Datatable

CompanyDT <- data.table(Company_Name=c("Froklo","Forklo","Forlko","Corp3","Grap","Garp"), Company_ID=c(1,1,1,2,3,3))

#   Company_Name Company_ID
#1:       Froklo          1
#2:       Forklo          1
#3:       Forlko          1
#4:        Corp3          2
#5:         Grap          3
#6:         Garp          3

我正在处理的循环

for(j in CompanyDT[,.(Company_ID)])
  FirstFacName <- CompanyDT[Company_ID[j], Company_Name]
  setDT(CompanyDT)[, Company_Name:=FirstFacName]

我想要这个结果,第一个拼写实例用相同的公司 ID 替换所有公司的名称:

#   Company_Name Company_ID
#1:       Froklo          1
#2:       Froklo          1
#3:       Froklo          1
#4:        Corp3          2
#5:         Grap          3
#6:         Grap          3

但我得到了这个结果,表中的第一个公司名称替换​​了所有公司名称,无论公司 ID 是什么:

#  Company_Name Company_ID
#1:       Froklo          1
#2:       Froklo          1
#3:       Froklo          1
#4:       Froklo          2
#5:       Froklo          3
#6:       Froklo          3

【问题讨论】:

    标签: r data.table spelling


    【解决方案1】:

    dplyr 的方式是:

    library(dplyr)
    CompanyDT %>% 
      group_by(Company_ID) %>%
      mutate(Company_Name_new = first(Company_Name))
    
    # A tibble: 6 x 3
    # Groups:   Company_ID [3]
      Company_Name Company_ID Company_Name_new
      <chr>             <dbl> <chr>           
    1 Froklo                1 Froklo          
    2 Forkslo               1 Froklo          
    3 Forlko                1 Froklo          
    4 Corp3                 2 Corp3           
    5 Grap                  3 Grap            
    6 Garp                  3 Grap 
    

    【讨论】:

    • 谢谢 z-cool,我将在我的较大数据集的样本上对此进行测试,但它似乎正在使用假数据集。显然我也是格式化stackoverflow问题的新手。无论如何感谢您的回答。
    • 不客气!如果它适用于更大的数据集,那么稍后将答案标记为正确会很好。
    • 是的,我对我的完整数据的随机样本进行了尝试,并且成功了。我确实将管道运算符分开,以便我将每个步骤写入 data.table,如下所示: CompanyDT
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多