【问题标题】:Creating a complicated new variable创建一个复杂的新变量
【发布时间】:2013-08-08 16:54:54
【问题描述】:

我有一个长格式的数据集,其中测量(时间)嵌套在 Networkpartners (NP) 中,而 Networkpartners (NP) 嵌套在 Persons (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) 的 Networkpartners(在两个结果之一中没有 NA)的数量:

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

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

【问题讨论】:

  • 我不明白你是如何获得NP.T 变量的...第一个值不应该是 1 吗?
  • @Thomas,我发表了完全相同的评论。我意识到(我认为是正确的)他不想在 both 都是 NA 时计算。措辞不正确,他/她似乎没有迅速回应。嗯..
  • 同一用户的类似question
  • @user2647568:我不确定这是否与您之前提出的here 不同,但看起来您正在寻找替代解决方案。
  • 嘿,我想计算在两个结果中至少具有一个值的那些 NP。换句话说:我不想计算那些在两个结果变量中都有 NA 的 NP,但我想计算那些在结果变量中只有一个或没有 NA 的 NP

标签: r dataframe plyr


【解决方案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

【讨论】:

  • 嘿,我想计算在两个结果中至少具有一个值的那些 NP。换句话说:我不想计算那些在两个结果变量中都有 NA 的 NP,但我想计算那些在结果变量中只有一个或没有 NA 的 NP。
  • @user2647568 好吧,我给了你两个答案。如果其中一个适合您,请告诉我。
  • 第二个可以工作,但我不知道如何将这个新变量放入我的数据集中。
【解决方案2】:

这是使用 plyr 包的解决方案,类似于我发布的 earlier

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

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多