R 基于主题数量组合的数据转换
我有一个很大的数据集,希望根据主题数量的组合对其进行转换。下面是一个简化的示例数据帧:R 基于主题数量组合的数据转换,r,R,我有一个很大的数据集,希望根据主题数量的组合对其进行转换。下面是一个简化的示例数据帧: data <- read.table(textConnection(" group subject status v1 v2 1 1 1 4 21 1 2 0 7 10 1 3 1 3 9 2 1 0 8 75 2 2 1 5 7 2 3
data <- read.table(textConnection("
group subject status v1 v2
1 1 1 4 21
1 2 0 7 10
1 3 1 3 9
2 1 0 8 75
2 2 1 5 7
2 3 1 2 11
2 4 1 6 1
3 1 1 9 37"), header = TRUE)
在newstatus中只有第二个新受试者取1,因为它是从第一个和第三个受试者转换而来的,所以它们在原始数据中的状态都取1。newv1和newv2是从v1
和v2
的总和转换而来的:v1+v1\u2=4+7=11,v1\u1+v1\u3=4+3=7,v1\u2+v1\u3=7+3=10……
在第四组中,有四名受试者,第二至第四组的状态为1。四名受试者中状态为1的三名受试者的组合为{(1,2,3)、(1,2,4)、(1,3,4)、(2,3,4)}。第二组的新数据在转换后如下所示:
newgroup newsubject newstatus newv1 newv2
1 1 0 11 31
1 2 1 7 30
1 3 0 10 19
newgroup newsubject newstatus newv1 newv2
2 1 0 15 93
2 2 0 19 83
2 3 0 16 87
2 4 1 13 19
三组的新数据如下所示:
data <- read.table(textConnection("
newgroup newsubject newstatus newv1 newv2
1 1 0 11 31
1 2 1 7 30
1 3 0 10 19
2 1 0 15 93
2 2 0 19 83
2 3 0 16 87
2 4 1 13 19
3 1 1 9 37"), header = TRUE)
data这将完成以下工作:
# first define the function we will apply to each group
f <- function(group) {
if (nrow(group) == 1 | sum(group$status) == 0)
group
else
with(group, {
v1 = combn(v1, sum(status), sum)
v2 = combn(v2, sum(status), sum)
status = ifelse(combn(status, sum(status), sum) == sum(status), 1, 0)
subject = seq_along(v1)
group = rep(group, length.out=length(v1))
data.frame(group, subject, status, v1, v2)
})
}
# apply f using by and collapse the results into a data.frame
do.call(rbind, by(data, INDICES=data$group, f))
# group subject status v1 v2
# 1.1 1 1 0 11 31
# 1.2 1 2 1 7 30
# 1.3 1 3 0 10 19
# 2.4 2 1 0 15 93
# 2.5 2 2 0 19 83
# 2.6 2 3 0 16 87
# 2.7 2 4 1 13 19
# 3 3 1 1 9 37
#首先定义我们将应用于每个组的函数
抱歉,我说得太多了,但是你对newstatus
专栏的解释我不清楚。谢谢。newstatus是基于多个主题的组合而创建的。例如,第一组的组合为{(1,2)、(1,3)、(2,3)},第一组和第三组(1,3)受试者在原始数据中的状态都取1,因此第二个newsubject在newstatus取1。第一个和第二个(1,2)或者第二个和第三个(2,3)主题在原始数据中的状态不都是1,所以第一个和第三个新闻主题在newstatus上都是0。非常好。我总是忘记combn
可以将函数作为参数+嗨,姆普劳德,再次感谢你的帮助。因为我的数据中有60多个变量,不仅仅是v1和v2,你有没有进一步的想法来有效地处理它?谢谢。嗨,先生,我还有一个问题。如果我将第二组中第三个受试者的状态从1改为0(对应的组合是{(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)}),代码似乎对它不起作用。data@user187454我没有太多的选择来加快这一过程。但是,如果这得到了您所要求的结果,请记住接受它。非常感谢您的帮助。