使用(从唯一列中提取唯一值)将一列添加到数据框

怀亚特

我是R的新手,无法为我遇到的特定问题寻找答案。

如果我的数据框如下所示:

d <- data.frame(Name = c("Jon", "Jon", "Jon", "Kel", "Kel", "Kel", "Don", "Don", "Don"),
             No1 = c(1,2,3,1,1,1,3,3,3),
             No2 = c(1,1,1,2,2,2,3,3,3))

Name No1 No2
Jon   1   1
Jon   2   1
Jon   3   1
Kel   1   2
Kel   1   2
Kel   1   2
Don   3   3
Don   3   3
Don   3   3 
...

我如何添加能够向数据框添加新列,其中这些列将指示columnNo1和中的唯一值No2:对于John,Kelly,分别为(1,2,3),(1,2),(3) ,唐

因此,如果将新列命名为ID#,则预期结果应为

d2 <- data.frame(Name = c("Jon", "Jon", "Jon", "Kel", "Kel", "Kel", "Don", "Don", "Don"),
          No1 = c(1,2,3,1,1,1,3,3,3),
          No2 = c(1,1,1,2,2,2,3,3,3),
          ID1 = c(1,1,1,1,1,1,3,3,3),
          ID2 = c(2,2,2,2,2,2,NA,NA,NA),
          ID3 = c(3,3,3,NA,NA,NA,NA,NA,NA))

Name No1 No2 ID1 ID2 ID3
Jon   1   1   1   2   3 
Jon   2   1   1   2   3
Jon   3   1   1   2   3 
Kel   1   2   1   2   NA
Kel   1   2   1   2   NA
Kel   1   2   1   2   NA
Don   3   3   3   NA  NA
Don   3   3   3   NA  NA
Don   3   3   3   NA  NA
利斯特尔

整洁的方法:

library(dplyr)
library(tidyr)

      # evaluate separately for each name
d %>% group_by(Name) %>% 
    # add a column of the unique values pasted together into a string
    mutate(ID = paste(unique(c(No1, No2)), collapse = ' ')) %>% 
    # separate the string into individual columns, filling with NA and converting to numbers
    separate(ID, into = paste0('ID', 1:3), fill = 'right', convert = TRUE)

## Source: local data frame [9 x 6]
## Groups: Name [3]
## 
##     Name   No1   No2   ID1   ID2   ID3
## * <fctr> <dbl> <dbl> <int> <int> <int>
## 1    Jon     1     1     1     2     3
## 2    Jon     2     1     1     2     3
## 3    Jon     3     1     1     2     3
## 4    Kel     1     2     1     2    NA
## 5    Kel     1     2     1     2    NA
## 6    Kel     1     2     1     2    NA
## 7    Don     3     3     3    NA    NA
## 8    Don     3     3     3    NA    NA
## 9    Don     3     3     3    NA    NA

这是一个很好的基本版本,带有基本的“拆分应用”组合方法:

# store distinct values in No1 and No2
cols <- unique(unlist(d[,-1]))
                           # split No1 and No2 by Name,
ids <- data.frame(t(sapply(split(d[,-1], d$Name), 
                           # find unique values for each split,
                           function(x){y <- unique(unlist(x))
                                       # pad with NAs,
                                       c(y, rep(NA, length(cols) - length(y)))
                           # and return a data.frame
                           }))) 
# fix column names
names(ids) <- paste0('ID', cols)
# turn rownames into column
ids$Name <- rownames(ids)
# join two data.frames on Name columns
merge(d, ids, sort = FALSE)

##   Name No1 No2 ID1 ID2 ID3
## 1  Jon   1   1   1   2   3
## 2  Jon   2   1   1   2   3
## 3  Jon   3   1   1   2   3
## 4  Kel   1   2   1   2  NA
## 5  Kel   1   2   1   2  NA
## 6  Kel   1   2   1   2  NA
## 7  Don   3   3   3  NA  NA
## 8  Don   3   3   3  NA  NA
## 9  Don   3   3   3  NA  NA

仅此而已,这是一个创造性的替代基本版本,该版本利用table而不是拆分/分组:

# copy d so as not to distort original with factor columns
d_f <- d
# make No* columns factors to ensure similar table structure
d_f[, -1] <- lapply(d[,-1], factor, levels = unique(unlist(d[, -1])))
# make tables of cols, sum to aggregate occurrences, and set as boolean mask for > 0
tab <- Reduce(`+`, lapply(d_f[, -1], table, d_f$Name)) > 0
# replace all TRUE values with values they tabulated
tab <- tab * matrix(as.integer(rownames(tab)), nrow = nrow(tab), ncol = ncol(tab))
# replace 0s with NAs
tab[tab == 0] <- NA
# store column names
cols <- paste0('ID', rownames(tab))
# sort each row, keeping NAs
tab <- data.frame(t(apply(tab, 2, sort, na.last = T)))
# apply stored column names
names(tab) <- cols
# turn rownames into column
tab$Name <- rownames(tab)
# join two data.frames on Name columns
merge(d, tab, sort = FALSE)

结果是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用(从唯一列中提取唯一值)将一列添加到数据框

来自分类Dev

使用dplyr将一列预测值添加到数据框

来自分类Dev

根据另一列中的值将值添加到熊猫数据框的一列中

来自分类Dev

根据另一列中的值将值添加到熊猫数据框的一列中

来自分类Dev

如何合并一列列表,提取唯一的字符串值,放入数据框

来自分类Dev

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

来自分类Dev

如何合并唯一列值上的数据框?

来自分类Dev

向R数据框中的同一列值添加唯一标识符

来自分类Dev

向R数据框中的同一列值添加唯一标识符

来自分类Dev

R:在数据框的列中提取唯一值

来自分类Dev

将嵌套数组中的值添加到唯一列表的效率更高

来自分类Dev

使用唯一的列名称迭代地将新列添加到数据框

来自分类Dev

如何将“$”添加到我的 Pandas 数据框值并使用一列作为索引?

来自分类Dev

根据另一行中另一列的值将列添加到数据框中

来自分类Dev

R - 将一列数据添加到数据框中的现有列

来自分类Dev

在R中,如何根据第一列的内容将一列添加到数据框中?

来自分类Dev

基于处理多次出现的另一列将一列添加到数据框

来自分类Dev

如何通过唯一列值将数据框分为几组并保存到文件

来自分类Dev

将多个值添加到一列

来自分类Dev

将列添加到 Pandas 数据框并遍历其中一列

来自分类Dev

根据参考 [Excel] 将一列中的值添加到另一列

来自分类Dev

一列的最大值基于另一列的每个唯一值(数据框)

来自分类Dev

根据数据框中另一列的值汇总和计算一列的唯一值

来自分类Dev

如何将一列添加到由另一列的n个先前值的数组组成的Pandas数据框中?

来自分类Dev

如何将一列添加到基于另一列中的值向上计数的数据框中?

来自分类Dev

提取R数据框中另一列中具有最大值的唯一行

来自分类Dev

根据同一数据框另一列中的字符将文本列添加到数据框

来自分类Dev

根据数据框中另一列的唯一值查找一列的所有组合

来自分类Dev

在保持每一列的类的同时将行添加到数据框中

Related 相关文章

  1. 1

    使用(从唯一列中提取唯一值)将一列添加到数据框

  2. 2

    使用dplyr将一列预测值添加到数据框

  3. 3

    根据另一列中的值将值添加到熊猫数据框的一列中

  4. 4

    根据另一列中的值将值添加到熊猫数据框的一列中

  5. 5

    如何合并一列列表,提取唯一的字符串值,放入数据框

  6. 6

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

  7. 7

    如何合并唯一列值上的数据框?

  8. 8

    向R数据框中的同一列值添加唯一标识符

  9. 9

    向R数据框中的同一列值添加唯一标识符

  10. 10

    R:在数据框的列中提取唯一值

  11. 11

    将嵌套数组中的值添加到唯一列表的效率更高

  12. 12

    使用唯一的列名称迭代地将新列添加到数据框

  13. 13

    如何将“$”添加到我的 Pandas 数据框值并使用一列作为索引?

  14. 14

    根据另一行中另一列的值将列添加到数据框中

  15. 15

    R - 将一列数据添加到数据框中的现有列

  16. 16

    在R中,如何根据第一列的内容将一列添加到数据框中?

  17. 17

    基于处理多次出现的另一列将一列添加到数据框

  18. 18

    如何通过唯一列值将数据框分为几组并保存到文件

  19. 19

    将多个值添加到一列

  20. 20

    将列添加到 Pandas 数据框并遍历其中一列

  21. 21

    根据参考 [Excel] 将一列中的值添加到另一列

  22. 22

    一列的最大值基于另一列的每个唯一值(数据框)

  23. 23

    根据数据框中另一列的值汇总和计算一列的唯一值

  24. 24

    如何将一列添加到由另一列的n个先前值的数组组成的Pandas数据框中?

  25. 25

    如何将一列添加到基于另一列中的值向上计数的数据框中?

  26. 26

    提取R数据框中另一列中具有最大值的唯一行

  27. 27

    根据同一数据框另一列中的字符将文本列添加到数据框

  28. 28

    根据数据框中另一列的唯一值查找一列的所有组合

  29. 29

    在保持每一列的类的同时将行添加到数据框中

热门标签

归档