2017-06-13 87 views
-1

我需要一些关于如何在R中启动实现问题的帮助。我有一个数据框,其中的行由变量“id”分组。对于每个'id'我只想保留一行。但是,我有许多标准来指定要删除哪些行。R根据各种标准删除行

这些都是我的一些标准:

  1. 我想保持它有“文本” = NA(可能有几个这样的行)各组“身份证”中的一个随机行;而且我也想保留该行的所有列,对于所有以下标准也是如此。
  2. 如果一个组中的所有行都有'text'== NA,那么我想保留一个随机行,它具有变量'check'== T(可能有几个这样的行)
  3. 如果所有行都在一个组具有'文本'== NA和'检查'== F,那么我想保留具有符合条件的变量'newtext'的行(grepl(“None”,df $ newtext))

我也可以提供一个数据集,如果这使得它更清晰。但是,我最重要的问题是,我不知道如何按照有序数量的条件来实现这种删除行的逻辑。 这将是很好,如果任何人都可以告诉我如何实现这样的代码。

谢谢!

这将是一个例子的数据集:

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3), 
      text=c("asd",NA,"asd",NA,NA,NA,NA,NA,NA), 
      check = c(T,F,T,T,T,F,F,F,F), 
      newtext = 
c("as","as","as","das","das","None","qwe","qwe2","None"), 
      othervars = c(1,2,3,45,5,6,6,7,1)) 

作为输出,我想保持下面的行: 行1或3 第4行或5 行7或8个 列othervars应保留以及我稍后需要这些信息。

希望这可以让它更清晰一些。

+0

如果您可以提供数据集或数据集的相关部分,那将会很好。这将为我们节省大量时间来编写任何可以在我们众多条件下实现的代码。 –

+0

我添加了一个最小的数据集。希望这可以帮助! – Rnewbie

回答

0

好的,我有东西。我正在使用从dplyr到子集的未知NA,因为我遇到了使用subset()或普通df[,]从基地R子集的问题。

数据:

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3), 
      text=c("asd",NA,"asd",NA,NA,NA,NA,NA,NA), 
      check = c(T,F,T,T,T,F,F,F,F), 
      newtext = 
c("as","as","as","das","das","None","qwe","qwe2","None"), 
      othervars = c(1,2,3,45,5,6,6,7,1)) 

发起新的空数据帧:

df2 <- df[0,] 

环路采样每id一行:

library(dplyr) 

for(i in unique(df$id)){ 
    temp <- filter(df, id == i) 
    if(nrow(filter(temp, !is.na(text))) > 0){ 
    temp <- filter(temp, !is.na(text)) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    }else if(nrow(filter(temp, check)) > 0){ 
    temp <- filter(temp, check) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    }else{ 
    temp <- filter(temp, !(grepl("None",temp$newtext))) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    } 
} 

输出例如:

> df2 
    id text check newtext othervars 
2 1 asd TRUE  as   1 
1 2 <NA> TRUE  das  45 
3 3 <NA> FALSE  qwe   6 

问候。

编辑:忽略左边的行号,它们是循环内不同子集的残差。

+0

感谢您的代码。它对我的数据集运行得非常快,尽管我有大约400k的观测值。 – Rnewbie