2017-04-18 98 views
1

假设我有以下数据帧。R数据帧 - 抑制值

data<-data.frame(index=1:10,col1=c('a','a','a','b','b','b','c','c','c','d'),col2=c(0,4,0,'up',0,0,0,'down',0,0)) 

index col1 col2 
    1 a 0 
    2 a 4 
    3 a 0 
    4 b up 
    5 b 0 
    6 b 0 
    7 c 0 
    8 c down 
    9 c 0 
    10 d 0 

如何获得下一个子框架? 我必须首先保持不同于零的唯一值(“col1”),如果不存在任何值(“col2”),则保留零。

data.frame(col1=c('a','b','c'),col2=c(4,'up','down')) 

col1 col2 
a 4 
b up 
c down 
d 0 

回答

3

下面是使用dplyr方式:

library(dplyr) 
# Use stringsAsFactors=FALSE to change the class of col1 and col2 
data %>% 
    group_by(col1) %>% 
    filter(all(unique(col2) == "0") | (col2 != "0")) 
Source: local data frame [4 x 3] 
Groups: col1 [4] 

    index col1 col2 
    <int> <chr> <chr> 
1  2  a  4 
2  4  b up 
3  8  c down 
4 10  d  0 
+3

或'data%>%arrange(col1,-as.numeric(col2))%>%distinct(col1,.keep_all = TRUE)' – Frank

0

或者我们可以使用data.table。转换 'data.frame' 到 'data.table'(setDT(data)),通过分组 'COL1',ifall的值是0 'COL2',退回没有0

的 'COL2' 或 else返回值
library(data.table) 
setDT(data)[, if(all(col2==0)) col2 else col2[col2!=0], col1] 
# col1 V1 
#1: a 4 
#2: b up 
#3: c down 
#4: d 0