gpt4 book ai didi

将 NA 替换为之前出现的位置

转载 作者:行者123 更新时间:2023-12-02 13:05:06 24 4
gpt4 key购买 nike

这是我的 CSV 数据示例。它包含约 10 列。

    Product_id    Product_Weight    Product_Name    Shop_Name ...
[1] A 10 xxxx Walmart
[2] B 12 yyyy Target
[3] C 11 zzzz Target
[4] A NA xxxx Walmart
[5] C NA zzzz Target

我想分别用 10 和 11 填充第 4 行和第 5 行中的 NA(因为从第 1 行和第 3 行已经知道 A 和 C 的产品重量)。我希望最终的数据框是这样的

    Product_id    Product_Weight    Product_Name    Shop_Name ...
[1] A 10 xxxx Walmart
[2] B 12 yyyy Target
[3] C 11 zzzz Target
[4] A 10 xxxx Walmart
[5] C 11 zzzz Target

在 R 中执行此操作的最佳方法是什么?

最佳答案

尽管问题询问的是“先前出现的情况”,但这会有一个缺点,即如果第一个 Product_Weight在任何 Product_idNA那么即使知道 Product_Weight 也无法填写来自随后的Product_id因此,我们不使用先前出现的情况,而是采用具有相同 Product_id 的所有非 NA 的平均值。 。由于这些应该都是相同的,因此它们的平均值就是它们的共同值。

如果您确实想要上一次出现的情况,请使用 Prev函数其中:

Prev <- function(x) na.locf(x, na.rm = FALSE)

代替na.aggregate在(1)和(3)中并且不使用(2)。

以下解决方案具有各自的优点:

  • 保留输入的顺序

  • 即使第一个Product_Weight也能工作在任何 Product_id不适用

  • 不要修改输入

第一个解决方案的另一个优点是只有一行代码(加上 library 语句),而第二个解决方案的另一个优点是不使用任何包。

1)zoo::na.aggregate 我们使用na.aggregate在 Zoo 包中(用非 NA 的平均值替换所有 NA),我们将其应用于 Product_Weight分别为每个Product_id .

library(zoo)
transform(DF, Product_Weight = ave(Product_Weight, Product_id, FUN = na.aggregate))

给予:

  Product_id Product_Weight Product_Name Shop_Name
1 A 10 xxxx Walmart
2 B 12 yyyy Target
3 C 11 zzzz Target
4 A 10 xxxx Walmart
5 C 11 zzzz Target

2) 没有软件包 或者使用 Mean代替na.aggregate哪里Mean定义为:

Mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

3) dplyr/zoo 添加行号,按Product_id分组,使用 na.aggregate 填写先前解决方案中的 NA如下图或Mean ,恢复原来的顺序并删除行号:

library(dplyr)
library(zoo)

DF %>%
mutate(row = row_number()) %>%
group_by(Product_id) %>%
mutate(Product_Weight = na.aggregate(Product_Weight)) %>%
ungroup() %>%
arrange(row) %>%
select(-row)

注意:这用于输入 DF :

Lines <- "    Product_id    Product_Weight    Product_Name    Shop_Name
A 10 xxxx Walmart
B 12 yyyy Target
C 11 zzzz Target
A NA xxxx Walmart
C NA zzzz Target"
DF <- read.table(text = Lines, header = TRUE)

关于将 NA 替换为之前出现的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37732090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com