gpt4 book ai didi

r - 在 R 中仅使用 NA 值识别 data.frame 中的行

转载 作者:行者123 更新时间:2023-12-04 03:11:28 25 4
gpt4 key购买 nike

我有一个 data.frame,其中包含 34 个有序变量和 NA 变量的 15,000 个观察值。我正在为市场分割研究执行聚类,需要仅删除 NAs 的行。取出用户 ID 后,我收到一条错误消息,说在聚类之前省略 2099 行,只有 NAs

我找到了一个链接,用于删除包含所有 NA 值的行,但我需要确定 2099 行中哪些行包含所有 NA 值。这里是讨论删除所有 NA 值的行的链接:Remove Rows with NAs in data.frame

以下是来自六个变量的前五个观察结果的样本:

> head(Store2df, n=5)
RowNo Age Gender HouseholdIncome MaritalStatus PresenceofChildren
1 1 <NA> Male <NA> <NA> <NA>
2 2 45-54 Female <NA> <NA> <NA>
3 3 <NA> <NA> <NA> <NA> <NA>
4 4 <NA> <NA> <NA> <NA> <NA>
5 5 45-54 Female 75k-100k Married Yes
#Making a vector
> Vector1 <- Store2df$RowNo
#Taking out RowNo column
> Store2df$RowNo <- NULL

编辑: 我把结果放在一个对象中,但发现代码做了一个额外的列。在 RStudio 的环境中单击,会创建一个名为 row.names 的额外列,用原始行名称标记每一行。删除了几千行,新列用旧行号标记了新行。但是,在查看新对象的头部时,我没有看到行标签。为什么 row.names 标签显示在环境中,但在我查看头部时不显示?
#Remove all rows with only NA values
> Store2df <- Store2[!!rowSums(!is.na(Store2)),]
#View head of store2df
> head(Store2df)
Age Gender HouseholdIncome MaritalStatus PresenceofChildren
1 <NA> Male <NA> <NA> <NA>
2 45-54 Female <NA> <NA> <NA>
5 45-54 Female 75k-100k Married Yes
6 25-34 Male 75k-100k Married No
7 35-44 Female 125k-150k Married Yes
8 55-64 Male 75k-100k Married No

编辑 2: 我放入行号/用户 ID 列以跟踪用户数量。为了执行删除所有 NA 的操作,我取出了第一列。现在我需要跟踪我删除的用户。我有一个包含所有 NA 值的超过 2000 行的列表,我不想在每一行中手动创建索引。

问题: 如何删除缺失数据对应的邮件?
> #First six rows of the column RowNo
> head(Store2df$RowNo)
[1] 1 2 3 4 5 6

我想在 Store2df data.frame 中删除 2099 行,其中包括 RowNo。这是识别 Store2df data.frame 中没有 RowNo 的行都是空的脚本。
> which(rowSums(is.na(Store2df))==ncol(Store2df))

显示前 6 行,第 3 行和第 4 行被删除。
> head(Store2df$RowNo)
[1] 1 2 5 6 7 8

有4个步骤我要完成:

1) 取出 Store2df RowNo 中的 data.frame 列并保存为单独的向量

2) 删除 Store2df NA 中所有值为 data.frame 的行

3) 删除 Store2new1 vector 中与 Store2df data.frame 相同的行

4) 将 vectordata.frame 与匹配 vectordata.frame 组合

最佳答案

 which(rowSums(is.na(Store2))==ncol(Store2))
#3 4
#3 4

要么
 which(Reduce(`&`,as.data.frame(is.na(Store2))))
#[1] 3 4

要么
 which(!rowSums(!is.na(Store2)))  
#3 4
#3 4

数据
 Store2 <- structure(list(Age = c(NA, "45-54", NA, NA, "45-54"), Gender = c("Male", 
"Female", NA, NA, "Female"), HouseholdIncome = c(NA, NA, NA,
NA, "75k-100k"), MaritalStatus = c(NA, NA, NA, NA, "Married"),
PresenceofChildren = c(NA, NA, NA, NA, "Yes"), HomeOwnerStatus = c(NA,
NA, NA, NA, "Own"), HomeMarketValue = c(NA, NA, NA, NA, "150k-200k"
)), .Names = c("Age", "Gender", "HouseholdIncome", "MaritalStatus",
"PresenceofChildren", "HomeOwnerStatus", "HomeMarketValue"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5"))

更新

删除全部为 NA 的行
  Store2[!!rowSums(!is.na(Store2)),]
# Age Gender HouseholdIncome MaritalStatus PresenceofChildren HomeOwnerStatus
#1 <NA> Male <NA> <NA> <NA> <NA>
#2 45-54 Female <NA> <NA> <NA> <NA>
#5 45-54 Female 75k-100k Married Yes Own
#HomeMarketValue
#1 <NA>
#2 <NA>
#5 150k-200k
  • is.na(Store2) 给出缺失元素的逻辑索引或 NA
  • ! 将否定逻辑索引,即 TRUE 变为 FALSE,反之亦然
  • 上面代码的
  • rowSums 给出了每行 not NA 元素的总和
        rowSums(!is.na(Store2))
    # 1 2 3 4 5
    # 1 2 0 0 7 # 3rd and 4th row have `0 non NA` values
  • ! 否定以上给出
        !rowSums(!is.na(Store2))
    # 1 2 3 4 5
    #FALSE FALSE TRUE TRUE FALSE
  • 我们想删除那些 all NA's0 non NAs 的行。所以 ! 再次
        !!rowSums(!is.na(Store2))
    #1 2 3 4 5
    #TRUE TRUE FALSE FALSE TRUE
  • 使用上述逻辑索引的子集

  • 更新2

    如果您有两个 rowNo ,即您在删除 NA 行之前单独存储的一个和删除 NA 之后的第二个。
       RowNo1 <- 1:6
    RowNo2 <- c(1,2,5,6)
    RowNo1 %in% RowNo2
    #[1] TRUE TRUE FALSE FALSE TRUE TRUE
    RowNo1[RowNo1 %in% RowNo2]
    #[1] 1 2 5 6

    更新3

    根据您的新要求,让我再试一次:
        Store2 <- structure(list(RowNo = 1:5, Age = c(NA, "45-54", NA, NA, "45-54"
    ), Gender = c("Male", "Female", NA, NA, "Female"), HouseholdIncome = c(NA,
    NA, NA, NA, "75k-100k"), MaritalStatus = c(NA, NA, NA, NA, "Married"
    ), PresenceofChildren = c(NA, NA, NA, NA, "Yes")), .Names = c("RowNo",
    "Age", "Gender", "HouseholdIncome", "MaritalStatus", "PresenceofChildren"
    ), class = "data.frame", row.names = c("1", "2", "3", "4", "5"
    ))

    第一步

    RowNo 保存为单独的向量(我不确定你为什么需要这个)
      Store2new1 <- Store2$RowNo

    第二步

    删除 Store2 data.frame 中所有 NA 值的行并将其存储为 Store2df
       Store2df <- Store2[!!rowSums(!is.na(Store2[,-1])),] #Here you already get the new dataset with `RowNo` column

    Store2df
    #RowNo Age Gender HouseholdIncome MaritalStatus PresenceofChildren
    #1 1 <NA> Male <NA> <NA> <NA>
    #2 2 45-54 Female <NA> <NA> <NA>
    #5 5 45-54 Female 75k-100k Married Yes

    第三步

    删除 Store2new1 向量中与 Store2df data.frame 相同的行
       Store2new2 <- Store2new1[Store2new1 %in% Store2df$RowNo]
    Store2new1[Store2new1 %in% Store2df$RowNo]
    #[1] 1 2 5

    第四步

    我真的不认为第四步或第三步是必需的,除非你想删除更多的行,这在帖子中并不清楚。

    关于r - 在 R 中仅使用 NA 值识别 data.frame 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25599139/

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