【问题标题】:Expanding a Frequency Table Where the Variable Names are the Values扩展以变量名称为值的频率表
【发布时间】:2014-08-27 18:15:12
【问题描述】:

我正在使用一个数据框,其中每个观察都链接到一个特定的 ID,并且我有一组变量来定义“值”,就好像我有一个因子变量一样。但是,“单元格”中的值是频率。这是一个简化的版本:

ID  1  2  3
A   2  3  2
B   1  4  1

我想获得两个扩展频率的向量,以便我可以计算每个 ID 的插值中位数。也就是说,我想要以下形式的东西:

A  B
1  1
1  2
2  2
2  2
2  2
3  3
3

psych 包有一个函数interp.median,然后可以获取每个向量并返回每个 ID 的插值中位数,我想将其作为新变量包含在原始数据帧中。我检查了vcdExtra 包,它可能可以通过它的expand.dft 功能做到这一点,但我不确定它究竟是如何工作的。

任何帮助将不胜感激!

编辑:为了进一步完善,如果最终结果是一个数据框,interp.median 效果最好,最后填充了 NA。也就是说,某种形式的东西:

A  B
1  1
1  2
2  2
2  2
2  2
3  3
3  NA

【问题讨论】:

    标签: r frequency median psych


    【解决方案1】:

    如果dat 是数据集

      lst <- by(dat[,-1], dat[,1], function(x) rep(seq_along(x), x))
      lst
      #dat[, 1]: A
      #[1] 1 1 2 2 2 3 3
      #------------------------------------------------------------ 
     #dat[, 1]: B
     #[1] 1 2 2 2 2 3
    
     indx <- max(sapply(lst,length))
     dat2 <- do.call(data.frame,lapply(lst, function(x) c(x,rep(NA,indx-length(x)))))
     dat2
     #  A  B
     #1 1  1
     #2 1  2
     #3 2  2
     #4 2  2
     #5 2  2
     #6 3  3
     #7 3 NA
    

    或者

      lst2 <- lapply(split(dat[,-1], dat$ID), function(x) rep(seq_along(unlist(x)), unlist(x)))
    
      do.call(data.frame,lapply(lst2, function(x) c(x,rep(NA,indx-length(x)))))
    

    数据

     dat <-  structure(list(ID = c("A", "B"), `1` = c(2L, 1L), `2` = 3:4, 
    `3` = c(2L, 1L)), .Names = c("ID", "1", "2", "3"), class = "data.frame", row.names = c(NA, 
     -2L))
    

    【讨论】:

    • 我认为第二次拍摄将起作用,只要我可以在最后用 NA 填充列表的每个元素,以使所有内容都具有相同的长度以转换为数据帧。关于如何做到这一点的建议?
    • 太棒了!我用更多的样本数据集进行了测试。我认为这会很好地工作。
    【解决方案2】:

    这里有一种方法:

    # your data
    df <- data.frame(ID=c(1,2,3), A=c(2,3,2), B=c(1,4,1))
    
    # function to repeat each ID a given number of times,
    # as specified in 'colname' of df
    rep_id <- function(colname) {
      unname(unlist(apply(df[, c('ID',colname)], 1, function(x) rep(x[1], x[2]))))
    }
    
    # apply this function to all columns (except the first, which is ID)
    sapply(names(df)[-1], rep_id)
    

    产量:

    $A
    [1] 1 1 2 2 2 3 3
    
    $B
    [1] 1 2 2 2 2 3
    

    【讨论】:

      【解决方案3】:

      样本数据:

      df <- read.table(text="
      ID  1  2  3
      A   2  3  2
      B   1  4  1", header=TRUE, check.names=FALSE)
      

      使用apply:

      (newlist <- apply(df[2:4], 1, function(x) rep(names(x), x)))
      #[[1]]
      #[1] "1" "1" "2" "2" "2" "3" "3"
      #
      #[[2]]
      #[1] "1" "2" "2" "2" "2" "3"
      
      names(newlist) <- df$ID
      #$A
      #[1] "1" "1" "2" "2" "2" "3" "3"
      #
      #$B
      #[1] "1" "2" "2" "2" "2" "3"
      

      这会输出字符,但你可以像这样输出数字:

      newlist <- apply(df[2:4], 1, function(x) rep(as.numeric(names(x)), x))
      names(newlist) <- df$ID
      

      编辑:

      要解决 OP 将向量放入 data.frame 并用 NA 填充的新请求,请在运行上述任一选项后调用:

      newlist <- sapply(newlist, function(x) x[1:max(sapply(newlist, length))])
      #     A  B
      #[1,] 1  1
      #[2,] 1  2
      #[3,] 2  2
      #[4,] 2  2
      #[5,] 2  2
      #[6,] 3  3
      #[7,] 3 NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-14
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2015-04-29
        • 2019-02-08
        相关资源
        最近更新 更多