R:对于列中的每个唯一值,在其他列中搜索相应的字符串并追加

时间:2018-03-27 13:17:24

标签: r

例如数据见下文。 假设我有一个包含两列A,B的data.frame.A由代码组成。代码链接到B列,其中包含人们可以居住的区域。一个代码可以对应多个区域。 我希望创建一个文件,其中每一行都包含一个唯一的代码,后面是填充了代码所属区域的列。

示例数据

        A       B
      <dbl>   <chr>
 1     1483 De Rijp
 2     1483 De Rijp
 3     1483 De Rijp-Gracht
 4     1483 De Rijp-Gracht
 5     1423 Huiswaard
 6     1423 Huiswaard-Noord
 7     1423 Huiswaard-Zuid
 8     1811 Centrum
 9     1811 Centrum
10     1811 Centrum
11     1811 Centrum
12     1811 Overdie
13     1811 Overdie
14     1811 Overdie
15     1811 Overdie

我最终希望得到什么:

       code   area    area_1          area_2         area_3  area_4
      <dbl>   <chr>   <chr>           <chr>          <chr>   <chr>
 1     1483 De Rijp   De Rijp-Gracht
 2     1423 Huiswaard Huiswaard-Noord Huiswaard-Zuid
 3     1811 Centrum   Overdie

我知道您可以使用unique(df$A)获取唯一代码,但在此之后我不知道从哪里开始以及什么是合适的。

编辑输入数据:

structure(list(A = c(1483, 1483, 1483, 1483, 1423, 1423, 1423, 
1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811), B = c("De Rijp", 
"De Rijp", "De Rijp-Gracht", "De Rijp-Gracht", "Huiswaard", "Huiswaard-Noord", 
"Huiswaard-Zuid", "Centrum", "Centrum", "Centrum", "Centrum", 
"Overdie", "Overdie", "Overdie", "Overdie")), .Names = c("A", 
"B"), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"
))

3 个答案:

答案 0 :(得分:5)

{{1}}

答案 1 :(得分:2)

这是你想要的吗?

ddf <- unique(df)

ddfs <- split(ddf, ddf$A)
dddfs <- lapply(ddfs, function(dd) transform(dd, area = paste0("area",1:nrow(dd))))
dddf <- do.call(rbind, dddfs)

library(reshape2)
dcast(dddf, A ~ area, value.var = "B")

这给出了:

> dcast(dddf, A ~ area, value.var = "B")
     A     area1           area2          area3
1 1423 Huiswaard Huiswaard-Noord Huiswaard-Zuid
2 1483   De Rijp  De Rijp-Gracht           <NA>
3 1811   Centrum         Overdie           <NA>

答案 2 :(得分:0)

这是你在找什么?

# Calculate maximum number of areas
noAreas <- max(sapply(lapply(unique(data$A),
               function(x) table(data[data$A %in% x, ]$B)), length))

library(plyr)
# Create data frame
ddply(data, 'A',
      function(x) {
        vec <- vector(mode = 'character', length = noAreas)
        areas <- unique(x$B)
        vec[1:length(areas)] <- areas
        vec
      })

您需要做的就是根据需要格式化最终数据框(即colnames)