0

我有一个小问题,我有这些参数:

df <- data.frame(Equip = c(1,1,1,1,1,2,2,2,2,2),
                 Notif = c(1,1,1,2,2,3,3,3,3,4),
                 Component = c("Dichtung","Motor","Getriebe","Service","Motor","Lüftung","Dichtring","Motor","Getriebe","Dichtring"),
                rank= c(1 , 1 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 2))

现在我想进行比较,只寻找一个Equip,如果第一个中使用Componentsrank,与第二个rank相同(只是相同Equip):

2种方式:

第一个:所有组件都一样吗?

任何(至少 1 个)组件是否相同?

我需要一个高度自动化的解决方案,因为我的数据集有超过 150k 行。

所需的答案可能是一个只有布尔表达式的向量,包括 TRUE 和 FALSE。

所以对于上面的例子,

answer <- c(TRUE,TRUE)

因为 Equip 1 rank 1 Component: Motor "AND" Equip 1 rank2 也是 Component: Motor。(1 所需方式的示例)

非常感谢您的帮助 =)


我使用了评论功能,但我无法显示问题,因为我想显示代码。

请对此感到抱歉..

原始数据有超过 2 个等级现在我想一步将等级 x 与等级 x+1 结合起来,因为这是使用的,为此我在函数中使用了一个 foor 循环,但它没有任何想法?

a <- lapply(split(df,df$Equips),function(x){
 for(i in 1:8){
  ll <- split(x,x$rank) 
if(length(ll)>i )
 ii <- intersect(ll[[i]]$Comps,ll[[i+1]]$Comps ) 
else ii <- NA c(length(ii)> 0 && !is.na(ii),ii) 
} 
})
 b <- unlist(a) 
c <- table(b,b) 
rowSums(c)

知道我能为它做什么(主要想法是一步获得 1-2,2-3,3-4 等的结果!

4

2 回答 2

0

这是一个可能的解决方案:

df <- data.frame(Equip = c(1,1,1,1,1,2,2,2,2,2),
                 Notif = c(1,1,1,2,2,3,3,3,3,4),
                 Component = c("Dichtung","Motor","Getriebe","Service","Motor","Lüftung","Dichtring","Motor","Getriebe","Dichtring"),
                 rank= c(1 , 1 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 2))


allComponents <- function(subDf){
  setequal(subDf[subDf$rank==1,'Component'],subDf[subDf$rank==2,'Component'])
}

anyComponents <- function(subDf){
  length(intersect(subDf[subDf$rank==1,'Component'],subDf[subDf$rank==2,'Component'])) > 0
}

# all components are equal
res1 <- by(df,INDICES=df$Equip,FUN=allComponents)
# at least one component equal
res2 <- by(df,INDICES=df$Equip,FUN=anyComponents)

as.vector(res1)
> FALSE, FALSE

as.vector(res2)
> TRUE, TRUE
于 2013-01-02T10:57:29.487 回答
0

plyr适合组操作

dat.r <- dlply(df ,.(Equip),function(x){      # I split by Equipe
  ll <- split(x,x$rank)                       # I split by rank

  if(length(ll)> 1)
    ii <- intersect(ll[[1]]$Comps,ll[[2]]$Comps ) ## test intersection
  else 
    ii <- NA
  c(length(ii)> 0 && !is.na(ii),ii)                        ## the result
})

在这里我得到了比较结果和组件名称

dat.r
$`1`
[1] "TRUE"  "Motor"

编辑:这里是基本包的结果(没有互联网)

lapply(split(df,df$Equip),function(x){      # I split by Equipe
  ll <- split(x,x$rank)                       # I split by rank
  if(length(ll)> 1)
    ii <- intersect(ll[[1]]$Comps,ll[[2]]$Comps ) ## test intersection
  else 
    ii <- NA
  c(length(ii)> 0 && !is.na(ii),ii)                                          ## the result
})

$`1`
[1] "TRUE"  "Motor"

$`2`
[1] "TRUE"      "Dichtring"
于 2013-01-02T11:57:22.670 回答