r - 创建一个复杂的新变量

标签 r dataframe plyr

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

相关文章:

apache-spark - 累积前几行中的数组(PySpark数据框)

python - 仅在创建 MultiIndex 时 Pandas DatetimeIndex NonExistentTimeError

r - 在 ddply 中使用大约?

R - 使用 data.table 连接超过 2^31 行

r - 从 R 中的数据框创建交叉表

r - 将自定义函数应用于数据框的每个子集并生成数据框

R-使用ddply对数据框中的列子集进行操作

R Shiny - 如何在渲染函数之间共享变量?

r - 在 R 中堆叠具有相似名称的列

r - 使用R中的distm()计算数据帧中两个GPS位置之间的距离