用重复的数据填充实际数据并删除重复的数据

Fill the actual data with duplicated data and remove duplicated data

提问人:Shawn Brar 提问时间:2/21/2022 更新时间:2/21/2022 访问量:37

问:

我有以下数据:-

library(data.table)
data <- data <- data.table(address = c("AA", "BB", "AA", "CC", "DD", "EE", "DD"),
                   revenue = c(NA, 121, 22, 33, 44, 33, NA),
                   castord = c(21, 22, NA, 3, NA, 223, 33),
                   versaze = c(NA, 22, 124, 33, NA, 44, 43))
data

#    address revenue castord versaze
# 1:      AA      NA      21      NA
# 2:      BB     121      22      22
# 3:      AA      22      NA     124
# 4:      CC      33       3      33
# 5:      DD      44      NA      NA
# 6:      EE      33     223      44
# 7:      DD      NA      33      43

现在这个数据已经和es重复了。它们的第一次出现有一些数据,如您在行中看到的那样。我想做的是使用这些 es 的重复行来填充此数据。如果重复的行具有 NA 值,则 NA 不应替换首次出现的行中的值。这将为我提供以下数据:-AADDaddressNA15address

    data <- data.table(address = c("AA", "BB", "AA", "CC", "DD", "EE", "DD"),
                   revenue = c(22, 121, 22, 33, 44, 33, NA),
                   castord = c(21, 22, NA, 3, 33, 223, 33),
                   versaze = c(124, 22, 124, 33, 43, 44, 43))

#    address revenue castord versaze
# 1:      AA      22      21     124
# 2:      BB     121      22      22
# 3:      AA      22      NA     124
# 4:      CC      33       3      33
# 5:      DD      44      33      43
# 6:      EE      33     223      44
# 7:      DD      NA      33      43

然后删除那些重复的行:-

data <- data.table(address = c("AA", "BB", "CC", "DD", "EE"),
                   revenue = c(22, 121, 33, 44, 33),
                   castord = c(21, 22, 3, 33, 223),
                   versaze = c(124, 22, 33, 43, 44))

#    address revenue castord versaze
# 1:      AA      22      21     124
# 2:      BB     121      22      22
# 3:      CC      33       3      33
# 4:      DD      44      33      43
# 5:      EE      33     223      44
r data.table 数据操作

评论


答:

1赞 John Nielsen 2/21/2022 #1

如果使用 和 where 则取第一个未使用的值,则第一行为 。dplyr::group_bysummariseNAna.omitNA

data <- data %>% group_by(address) %>% 
  summarise(
    revenue = first(na.omit(revenue)),
    castord = first(na.omit(castord)),
    versaze = first(na.omit(versaze))
    )

评论

0赞 Shawn Brar 2/21/2022
有没有办法做到这一点?data.table
0赞 John Nielsen 2/21/2022
我不知道,我也无法浏览他们的文档。为什么使用 dplyr/tidyverse 有问题?
0赞 Shawn Brar 2/21/2022
实际上,我拥有的实际表非常大,约为 900 mb,我想用它来尽可能提高内存效率。data.table
3赞 zx8754 2/21/2022 #2

使用 data.table,按地址分组,遍历列,删除 NA,获取第一个值:

data[, lapply(.SD, function(i) (na.omit(i)[ 1 ])), by = address]
#    address revenue castord versaze
# 1:      AA      22      21     124
# 2:      BB     121      22      22
# 3:      CC      33       3      33
# 4:      DD      44      33      43
# 5:      EE      33     223      44