卸妆观察没有重复

时间:2014-08-08 16:46:02

标签: r dataset duplicates

我想将数据集分成两个框架 - 一个原始数据集基于条件具有重复观察,另一个原始数据集基于条件没有重复观察。在下面的例子中,我想将框架分成一个只有一个编码器用于观察的框架和一个有两个编码器的框架::

frame <- data.frame(id = c(1,1,1,2,2,3), coder = c("A", "A", "B", "A", "B", "A"), y = c(4,5,4,1,1,2))
frame

为此,我想制作,以便:

  frame1:

     id coder y
  1  1     A 4
  2  1     A 5
  3  1     B 4
  4  2     A 1
  5  2     B 1

  frame2:

  6  3     A 2

2 个答案:

答案 0 :(得分:1)

您可以使用aggregate确定每个数据框中需要的ID:

cts <- aggregate(coder~id, frame, function(x) length(unique(x)))
cts
#   id coder
# 1  1     2
# 2  2     2
# 3  3     1

然后你可以根据这个来适当地进行分组:

subset(frame, id %in% cts$id[cts$coder >= 2])
#   id coder y
# 1  1     A 4
# 2  1     A 5
# 3  1     B 4
# 4  2     A 1
# 5  2     B 1
subset(frame, id %in% cts$id[cts$coder < 2])
#   id coder y
# 6  3     A 2

答案 1 :(得分:0)

您也可以尝试:

 indx <- !colSums(!table(frame$coder, frame$id))
 frame[frame$id %in% names(indx)[indx],]
#   id coder y
#1  1     A 4
#2  1     A 5
#3  1     B 4
#4  2     A 1
#5  2     B 1

 frame[frame$id %in% names(indx)[!indx],]
#  id coder y
#6  3     A 2

解释

 table(frame$coder, frame$id) 
  #    1 2 3
  #  A 2 1 1
  #  B 1 1 0 #Here for id 3, B==0
  • 如果我们否定,结果将是逻辑索引
  • !table(frame$coder, frame$id)
  • 执行上述colSums,结果

    # 1 2 3 
    # 0 0 1 
    
  • 再次取消并获取ids的索引并对TRUE
  • 的那些ID进行子集化
  • 通过与ids
  • 的名称匹配,您可以从中进行分组