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我没有太多的选择来加快这一过程。但是,如果这得到了您所要求的结果,请记住接受它。非常感谢您的帮助。