我有一个长格式的数据集,其中测量(时间)嵌套在网络合作伙伴(NP)中,而网络合作伙伴(NP)又嵌套在人员(ID)中,下面是它的示例(真实的数据集有数千个行):
ID NP Time Outcome1 Outcome2
1 11 1 4 NA
1 11 2 3 4
1 11 3 NA NA
1 12 1 2 3
1 12 2 3 1
1 12 3 3 2
2 21 1 2 4
2 21 2 NA NA
2 21 3 NA NA
2 22 1 4 NA
2 22 2 4 3
2 22 3 NA 4
现在我想创建以下新变量“NP.T”:
特定时间特定人员 (ID) 的网络合作伙伴(在此测量中结果 1 和结果 2 中没有 NA)的数量。换句话说:我想计算在两个结果变量上有一个或没有 NA 的 NP。我不想计算那些在两个结果变量中都有 NA 的 NP。
所以我想创建一个像这样的数据集:
ID NP Time Outcome1 Outcome2 NP.T
1 11 1 4 NA 2
1 11 2 3 4 2
1 11 3 NA NA 1
1 12 1 2 3 2
1 12 2 3 1 2
1 12 3 3 2 1
2 21 1 2 4 2
2 21 2 NA NA 1
2 21 3 NA NA 1
2 22 1 4 NA 2
2 22 2 4 3 1
2 22 3 NA 4 1
我有之前 question 中提供的解决方案关于如何创建一个变量来计算特定时间特定人员 (ID) 的网络合作伙伴(在两个结果之一中没有 NA)的数量:
library(plyr)
mydata1<-ddply(mydata,.(ID,Time),transform, NP.T=length(Outcome[which(Outcome ! ="NA")]))
现在,如果有人可以帮助我找到我的具体问题的答案,我将非常感激!
最佳答案
我想我一定误解了这个问题,因为我不确定你如何获得预期的结果向量。如果您想要每个 ID/时间组合的 NP 数量,且任一结果都没有 NA
值,请尝试以下操作。
# data:
mydf <- read.table(text="ID NP Time Outcome1 Outcome2
1 11 1 4 NA
1 11 2 3 4
1 11 3 NA NA
1 12 1 2 3
1 12 2 3 1
1 12 3 3 2
2 21 1 2 4
2 21 2 NA NA
2 21 3 NA NA
2 22 1 4 NA
2 22 2 4 3
2 22 3 NA 4",header=TRUE)
# ave:
mydf$NP.T <- with(mydf, ave(NP*as.numeric(rowSums(is.na(cbind(Outcome1,Outcome2)))==0),
list(ID,Time),
FUN=function(x) sum(unique(x)>0)))
#[1] 1 2 1 1 2 1 1 1 0 1 1 0
如果 Arun 的评论是正确的,那么这就是您想要的:
mydf$NP.T <- with(mydf, ave(NP*as.numeric(rowSums(is.na(cbind(Outcome1,Outcome2)))<2),
list(ID,Time),
FUN=function(x) sum(unique(x)>0)))
#[1] 2 2 1 2 2 1 2 1 1 2 1 1
关于r - 创建一个复杂的新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131721/