聚合数据以计算R中的答案

时间:2014-12-09 10:43:50

标签: r variables dataset aggregation

我在 R 中有一个大数据集,我的问题与此数据集中的8个不同变量有关,询问人们的情况。网络。变量都将代码分配给不同的人,指定与此人的关系..

我想将答案代码汇总为两组(friends = 1,family = 2),然后创建一个新变量,计算8个变量中有多少朋友和家人列出。

我希望这是可以理解的,我将非常感谢你的帮助。

这就是我的数据的样子:

 [117,]  id 106  201  202  102  103  452  452  501
 [118,]  id 106  201  202  302  301  451   NA   NA
 [119,]  id 201  202  106  102  105  601  602  602
 [120,]  id 106  201  202  406  301  302   NA   NA

我想要两个变量来计算每个参与者的朋友和家人的绝对数量。

101-452是家庭代码,除了106和120

501-801是朋友代码,除了702

1 个答案:

答案 0 :(得分:0)

这可能比你想要的更加迂回,但这个解决方案很简单。由于您没有提供dput()数据帧,我冒昧地重新创建您发布的数据帧:

    dF <- as.data.frame(matrix(data = c("id", 106, 201, 202, 102, 103, 452, 452, 501, 
                                        "id", 106, 201, 202, 302, 301, 451, NA, NA, 
                                        "id", 201, 202, 106, 102, 105, 601, 602, 602,  
                                        "id", 106, 201, 202, 406, 301, 302, NA, NA), 
                               ncol = 9, nrow = 4, byrow = T))
    names(dF) <- c("value", paste0("c", seq(1:8)))

由于id值,我还必须调整dF中每列的类:

    #Change each column to a numeric variable
    dF$c1 <- as.numeric(as.character(dF$c1))
    dF$c2 <- as.numeric(as.character(dF$c2))
    dF$c3 <- as.numeric(as.character(dF$c3))
    dF$c4 <- as.numeric(as.character(dF$c4))
    dF$c5 <- as.numeric(as.character(dF$c5))
    dF$c6 <- as.numeric(as.character(dF$c6))
    dF$c7 <- as.numeric(as.character(dF$c7))
    dF$c8 <- as.numeric(as.character(dF$c8))

接下来,您必须创建一些告诉R什么是familyfriend的方式:

    #101-452 are family codes apart from 106 and 120
    #501-801 are friend codes, apart from 702
    fam <- as.numeric(c(101:105, 107:119, 121:452))
    fnd <- as.numeric(c(501:701, 703:801))

我编写了一个名为SumIn()的函数,以确定dFfamfnd的每一行中的每个值是否都显示为:

    SumIn <- function(x){
      #Create a sum for each row of your dataframe where the column value is 
      # within the parameters you've given for both "family" and "friend"
      valFam <- sum(x %in% fam, na.rm = T)
      valFnd <- sum(x %in% fnd, na.rm = T)

    #Combine the two
      vals <- as.data.frame(t(rbind(valFam, valFnd)))

      return(vals)
    }

我创建了一个新的数据框,以简化操作,但您可以轻松地将其应用于当前的数据框:

    newDf <- as.data.frame(matrix(NA, ncol = 11, nrow = nrow(dF)))
    names(newDf) <- c("id", paste0("c", seq(1:8)), "sumFam", "sumFnd")  
    newDf$id <- "id"

因为您只想应用原始dF中的数字,只需将dF子集到apply()到这些列。

    for(i in 1:nrow(dF)){
      newDf[i, 2:11] <- cbind(dF[i, 2:9], apply(dF[i, ], 1, SumIn))
    }

    > newDf
      id  c1  c2  c3  c4  c5  c6  c7  c8 sumFam sumFnd
    1 id 106 201 202 102 103 452 452 501      6      1
    2 id 106 201 202 302 301 451  NA  NA      5      0
    3 id 201 202 106 102 105 601 602 602      4      3
    4 id 106 201 202 406 301 302  NA  NA      5      0

您应该可以取消创建newDf并将其直接应用于您的数据框。我刚刚在这里做了一个例子。

这可能有点 hacky ,但它很简单,不需要一堆R知识。我确信还有其他方法可以获得你需要的结果。