假设我有以下数据框。
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
答案 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
答案 1 :(得分:0)
或者我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(data)
),按'col1'分组,if
all
'col2'中的值为0,返回'col2' '或else
返回非0的值
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