R 比较第一列中指定的组之间的交点

R 比较第一列中指定的组之间的交点,r,set-intersection,cross-product,R,Set Intersection,Cross Product,假设我有一个由三列组成的数据框:第一列指定一个功能的编号(例如颜色),第二列指定一个组,第三列指定该组中存在的功能(1)或该组中缺少的功能(0): 或: 无论如何,我需要对一个相当大的数据文件有一个更好的概述(原始文件有大约10组中的数百个特性)。tbltbl听起来像是一个表就是你想要的。首先,我们对行进行子集划分,使在那里列等于1,并删除第三列。然后我们在该子集上调用一个表 > ( tab <- table(d[d$is_there == 1, -3]) ) # g

假设我有一个由三列组成的数据框:第一列指定一个功能的编号(例如颜色),第二列指定一个组,第三列指定该组中存在的功能(1)或该组中缺少的功能(0):

或:


无论如何,我需要对一个相当大的数据文件有一个更好的概述(原始文件有大约10组中的数百个特性)。

tbl
tbl听起来像是一个
就是你想要的。首先,我们对行进行子集划分,使
在那里
列等于1,并删除第三列。然后我们在该子集上调用一个

> ( tab <- table(d[d$is_there == 1, -3]) )
#         group
# feature  a b
#   blue   1 1
#   green  1 1
#   red    0 1
#   yellow 0 0

b也一样

听起来像是一个
表格
就是你想要的。首先,我们对行进行子集划分,使
在那里
列等于1,并删除第三列。然后我们在该子集上调用一个

> ( tab <- table(d[d$is_there == 1, -3]) )
#         group
# feature  a b
#   blue   1 1
#   green  1 1
#   red    0 1
#   yellow 0 0

对b组同样如此,这会起作用吗

> tapply(d$feature[d$is_there==1],d$group[d$is_there==1], table)

$a
blue  green    red yellow 
   1      1      0      0 

$b
blue  green    red yellow 
   1      1      1      0 

这样行吗

> tapply(d$feature[d$is_there==1],d$group[d$is_there==1], table)

$a
blue  green    red yellow 
   1      1      0      0 

$b
blue  green    red yellow 
   1      1      1      0 
请尝试以下代码:

with(d, tapply(is_there, list(feature, group), sum))
#       a b
#blue   1 1
#green  1 1
#red    0 1
#yellow 0 0
请尝试以下代码:

with(d, tapply(is_there, list(feature, group), sum))
#       a b
#blue   1 1
#green  1 1
#red    0 1
#yellow 0 0

以以下数据帧为例:

myd <- data.frame(
  feature=c("red","blue","green","yellow","red","blue","green","yellow"),
  group=c(rep("a",4),rep("b",4)),
  is_there=c(0,1,1,0,1,0,1,0))
从这里提取那些无处不在的东西是微不足道的


请注意,提供矩阵的任何其他解决方案都同样有效(tapply解决方案将更快)

采用以下数据框:

myd <- data.frame(
  feature=c("red","blue","green","yellow","red","blue","green","yellow"),
  group=c(rep("a",4),rep("b",4)),
  is_there=c(0,1,1,0,1,0,1,0))
从这里提取那些无处不在的东西是微不足道的



请注意,提供矩阵
res
的任何其他解决方案都同样有效(tapply解决方案会更快)

@Richard Scriven我不确定OP是否希望这样。可能是你的解决方案是双重的!!”不同于“!”?@aldorado它是双重否定。试试
!d$在那里
!!d$is_在那里
@aldorado这是一个将1和0转换为真和假的黑客。有些东西
as.logical()
像well@Richard斯克里文我不确定这是否是OP想要的。可能是你的解决方案是双重的!!”不同于“!”?@aldorado它是双重否定。试试
!d$在那里
!!d$is_在那里
@aldorado这是一个将1和0转换为真和假的黑客。一些
as.logical()
也会这样做。这并不表明两组中的任何一组都不存在黄色?也许我的问题问得不准确。@Richard Scriven+1您的
表格比您的
更干净mine@akrun-谢谢。你的名字也可以加回去<代码>表格(功能=d$功能[!!d$在那里],组=d$组[!!d$在那里])
。我想这取决于子集。哦,明白了。是的,我有个教授对桌子很着迷。哈哈。这并不是说两组中都没有黄色?也许我的问题问得不准确。@Richard Scriven+1您的
表格比您的
更干净mine@akrun-谢谢。你的名字也可以加回去<代码>表格(功能=d$功能[!!d$在那里],组=d$组[!!d$在那里])
。我想这取决于子集。哦,明白了。是的,我有个教授对桌子很着迷。哈哈。
tapply
table
快?@RichardScriven
tapply
acast
快,
table
给出了不同的结果(比如:不是你需要的结果)
tapply
table
快?@RichardScriven
tapply
acast
快,
table
给出了不同的结果(例如:不是您需要的结果)
with(d, tapply(is_there, list(feature, group), sum))
#       a b
#blue   1 1
#green  1 1
#red    0 1
#yellow 0 0
myd <- data.frame(
  feature=c("red","blue","green","yellow","red","blue","green","yellow"),
  group=c(rep("a",4),rep("b",4)),
  is_there=c(0,1,1,0,1,0,1,0))
require(reshape2)

res <- acast(myd,feature ~ group, fun=sum, value.var="is_there")
where <- factor(
  colSums(res) - 2*diff(t(res)),
  levels=c(-1,0,2,3),
  labels=c("group2","nowhere","both","group1")
  )
> res
       a b
blue   1 0
green  1 1
red    0 1
yellow 0 0
> where
   blue   green     red  yellow 
 group1    both  group2 nowhere 
Levels: group2 nowhere both group1