在R中,按列1查找重复项,按非NA列3过滤

时间:2016-10-01 03:27:00

标签: r

我有一个数据框:

a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
c <- c(1,NA,2,4,NA,1,2,2)
df <-data.frame(a,b,c)

我在第1列中有一些包含重复变量的数据框,但是当我使用重复的函数时,它会在使用副本(函数)重复删除后随机选择行

dedup_df = df[!duplicated(df$a), ] 

如何确保输出返回c列c上不包含NA的行?

我尝试使用dplyr包,但输出只打印结果

library(dplyr)
options(dplyr.print_max = Inf )
df %>%                    ## source dataframe
group_by(a) %>%         ## grouped by variable
filter(!is.na(c) )  %>% ## filter by Gross value
as.data.frame(dedup_df)

1 个答案:

答案 0 :(得分:0)

您使用string primeNumbers = ""; //add numbers to string primeNumbers = primeNumbers.Substring(0, primeNumbers.Length - 1); 函数删除重复的观察(行),使用列作为数据框中的键是正确的。

但似乎您担心它可能会在另一列中保留包含NA的行并删除包含非NA值的另一行。

我会用你的例子,但稍加修改

duplicated

在这种情况下,您的dedup_df包含第一个值的NA。

a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
c <- c(NA,1,2,4,NA,1,2,2)
df <-data.frame(a,b,c)

> df
  a b  c
1 A 1 NA
2 A 1  1
3 A 2  2
4 B 4  4
5 B 1 NA
6 B 1  1
7 C 2  2
8 C 2  2

解决方案:

首先按列c重新排序df,然后使用相同的命令。列c的这种重新排序将把所有NA发送到数据帧的末尾。当> dedup_df = df[!duplicated(df$a), ] > dedup_df a b c 1 A 1 NA 4 B 4 4 7 C 2 2 通过时,它会看到这些行最后有NA并且如果之前的那行没有NA则会将它们标记为TRUE。

duplicated

您也可以按降序重新排序

df = df[order(df$c),]
dedup_df = df[!duplicated(df$a), ]

> dedup_df
  a b c
2 A 1 1
6 B 1 1
7 C 2 2