0

group所以我有一个非常大(机密,因此名称模糊)的数据集,其中包含许多变量,我们将相关变量称为dummy1. 我想要做的是创建一个新变量 ,dummy2它确定dummy1对于至少一个具有相同值的观察是否为真(在这种情况下为 1)group。这个变量必须对每个观察值都有一个值,即使dummy1是在(没有s )NA中的某人时也是如此。我对 R 和编程很陌生,所以我无法弄清楚如何从中提取这些信息以用于变量,这似乎是你想要做的,但我被困住了。groupNAgroupaggregate

所以这是我的数据假设最终看起来像的一部分:

Obs. Group Dummy1 Dummy2
1    101   0      1
2    101   1      1 
3    101   0      1 
4    102   0      0 
5    102   0      0 
6    103   1      1 
7    103   1      1 
8    103   1      1 

所以这里的想法是,由于组101中至少有一个人的值为 1 dummy1,该组的所有成员在. 该数据集在 1300 个组中有接近 7k 的观测值,所以我需要某种我怀疑的循环设置,但是有人可以帮助我吗?dummy2dummy1dummy2

谢谢!

4

2 回答 2

3

我认为这里plyrddply是一个更好的选择

require(plyr)
ddply(data, .(Group), transform, Dummy2 = 1 * any(Dummy1, na.rm = TRUE))

##    Obs. Group Dummy1 dummy2
## 1    1   101      0      1
## 2    2   101      1      1
## 3    3   101      0      1
## 4    4   102      0      0
## 5    5   102      0      0
## 6    6   103      1      1
## 7    7   103      1      1
## 8    8   103      1      1

如果出于任何原因您希望更快地处理数据,则data.table可以使用

require(data.table)
data <- as.data.table(data)
data[, Dummy2:= 1 * any(Dummy1, na.rm = TRUE), by = "Group"]

data
##    Obs. Group Dummy1 Dummy2
## 1:    1   101      0      1
## 2:    2   101      1      1
## 3:    3   101      0      1
## 4:    4   102      0      0
## 5:    5   102      0      0
## 6:    6   103      1      1
## 7:    7   103      1      1
## 8:    8   103      1      1

编辑:感谢@Dwin,添加na.rm = TRUE的是any处理缺失值

于 2013-07-11T21:50:11.553 回答
2
df$Dummy2 <- with(df, ave(Dummy1 , Group, 
                                FUN=function(x) max(c(0,x), na.rm=TRUE) ) )

测试对象:

df <- structure(list(Obs. = 1:8, Group = c(101L, 101L, 101L, 102L, 
102L, 103L, 103L, 103L), Dummy1 = c(0L, NA, 0L, NA, NA, 1L, NA, 
1L), Dummy2 = c(0, 0, 0, 0, 0, 1, 1, 1)), .Names = c("Obs.", 
"Group", "Dummy1", "Dummy2"), row.names = c(NA, -8L), class = "data.frame")
于 2013-07-11T22:35:08.083 回答