获取列的唯一值,并将每个列添加到data.table中与`by`相同的行中的唯一列中

时间:2018-02-23 02:28:13

标签: r data.table

提前道歉......我无法表达更好的头衔。

问题在于:

我正在使用data.table并使用'by'对行进行分组。这导致与感兴趣的列的唯一值具有相同的行数。对于每个唯一的'by'值(在此示例中为'lat_lon'),我想在另一列(ID)中获取唯一值,并将它们添加到与unique by列相同的行。

Here is an example:    
    lat_lon              ID
 1: 42.04166667_-80.4375 26D25
 2: 42.04166667_-80.4375 26D26
 3: 42.04166667_-80.3125 26D34
 4: 42.04166667_-80.3125 26D35
 5: 42.04166667_-80.3125 26D36
 6:      42.125_-80.1875 26D41
 7:      42.125_-80.1875 27C46
 8:      42.125_-80.1875 27D42
 9: 42.04166667_-80.1875 26D43
10: 42.04166667_-80.1875 26D45
11: 42.04166667_-80.1875 27D44
12: 42.04166667_-80.1875 27D46
13: 42.29166667_-79.8125 27B76
14: 42.20833333_-80.0625 27C53
15: 42.20833333_-80.0625 27C54
16:      42.125_-80.0625 27C55
17:      42.125_-80.0625 27C56
18:      42.125_-80.0625 27D51
19:      42.125_-80.0625 27D52

我真正想要的是:

lat_lon              ID.1  ID.2    ID.3 ID.4 ID.5 ID.6 ID.7 ID.8 ID.9 ID.10
42.04166667_-80.4375 26D25 26D26   NA   NA   NA   NA   NA   NA   NA   NA
42.04166667_-80.3125 26D34 26D35 26D36  NA   NA   NA   NA   NA   NA   NA
...   
42.125_-80.0625      27C55 27C56 27D51 27D52 NA   NA   NA   NA   NA   NA

感谢您的耐心和有用的评论。

2 个答案:

答案 0 :(得分:0)

这是对data.table的偏离(不是说我不能在那里完成,但我不太熟悉)进入tidyverse

require(tidyr)
require(dplyr)
wide_data <- dat %>% group_by(lat_lon) %>% mutate(IDno = paste0("ID.",row_number())) %>% spread(IDno, ID)

这假设没有重复的行,其中重复了一个lat_lon的ID。如果不是这样的话,您可以在分组之前将distinct()添加到链中

答案 1 :(得分:0)

对于data.table解决方案,首先添加一个idx列(rn)然后使用dcast.data.table进行转移会有所帮助:

dcast.data.table(dat[, rn := paste0("ID.", seq_len(.N)), by=.(lat_lon)], 
    lat_lon ~ rn, value.var="ID")

#                 lat_lon  ID.1  ID.2  ID.3  ID.4
# 1: 42.04166667_-80.1875 26D43 26D45 27D44 27D46
# 2: 42.04166667_-80.3125 26D34 26D35 26D36    NA
# 3: 42.04166667_-80.4375 26D25 26D26    NA    NA
# 4:      42.125_-80.0625 27C55 27C56 27D51 27D52
# 5:      42.125_-80.1875 26D41 27C46 27D42    NA
# 6: 42.20833333_-80.0625 27C53 27C54    NA    NA
# 7: 42.29166667_-79.8125 27B76    NA    NA    NA

数据:

dat <- fread("lat_lon              ID
42.04166667_-80.4375 26D25
42.04166667_-80.4375 26D26
42.04166667_-80.3125 26D34
42.04166667_-80.3125 26D35
42.04166667_-80.3125 26D36
42.125_-80.1875 26D41
42.125_-80.1875 27C46
42.125_-80.1875 27D42
42.04166667_-80.1875 26D43
42.04166667_-80.1875 26D45
42.04166667_-80.1875 27D44
42.04166667_-80.1875 27D46
42.29166667_-79.8125 27B76
42.20833333_-80.0625 27C53
42.20833333_-80.0625 27C54
42.125_-80.0625 27C55
42.125_-80.0625 27C56
42.125_-80.0625 27D51
42.125_-80.0625 27D52")