2

我有一个长格式的数据集,其中测量(时间)嵌套在网络伙伴(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

我有前面问题中提供的解决方案,关于如何创建一个变量来计算特定时间特定人员 (ID) 的 Networkpartners 的数量(在两个结果之一中没有 NA):

library(plyr)
mydata1<-ddply(mydata,.(ID,Time),transform, NP.T=length(Outcome[which(Outcome !   ="NA")]))

现在,如果有人可以帮助我找到关于我的具体问题的答案,我将非常感激!

4

2 回答 2

1

我想我一定误解了这个问题,因为我不确定你是如何得到预期的结果向量的。如果您想要每个 ID/时间组合对于任一结果都没有NA值的 NP 数量,请尝试以下操作。

# 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
于 2013-08-08T17:26:17.060 回答
1

这是使用 plyr 包的解决方案,与我之前发布的类似。

mydata<-structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), NP = c(11L, 11L, 11L, 12L, 12L, 12L, 21L, 21L, 21L, 
22L, 22L, 22L), Time = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L), Outcome1 = c(4L, 3L, NA, 2L, 3L, 3L, 2L, NA, NA, 
4L, 4L, NA), Outcome2 = c(NA, 4L, NA, 3L, 1L, 2L, 4L, NA, NA, 
NA, 3L, 4L)), .Names = c("ID", "NP", "Time", "Outcome1", "Outcome2"
), class = "data.frame", row.names = c(NA, -12L))
> mydata
   ID NP Time Outcome1 Outcome2
1   1 11    1        4       NA
2   1 11    2        3        4
3   1 11    3       NA       NA
4   1 12    1        2        3
5   1 12    2        3        1
6   1 12    3        3        2
7   2 21    1        2        4
8   2 21    2       NA       NA
9   2 21    3       NA       NA
10  2 22    1        4       NA
11  2 22    2        4        3
12  2 22    3       NA        4

mydata1<-ddply(mydata,.(ID,Time),transform,NP.T=length(which(!(Outcome1 =="NA" & Outcome2 =="NA"))))
> mydata1
   ID NP Time Outcome1 Outcome2 NP.T
1   1 11    1        4       NA    2
2   1 12    1        2        3    2
3   1 11    2        3        4    2
4   1 12    2        3        1    2
5   1 11    3       NA       NA    1
6   1 12    3        3        2    1
7   2 21    1        2        4    2
8   2 22    1        4       NA    2
9   2 21    2       NA       NA    1
10  2 22    2        4        3    1
11  2 21    3       NA       NA    1
12  2 22    3       NA        4    1
于 2013-08-08T22:34:49.397 回答