【问题标题】:R: Apply-like function for dataframe rows when columns varyR:列变化时数据框行的类应用函数
【发布时间】:2015-04-16 17:43:16
【问题描述】:

我有一个稀疏数据框example。它有五个数据列,但每一行只有两个条目,随机分布在列中:

id  a   b   c   d   e
1   NA  10  NA  NA  1
2   6   NA  10  NA  NA
3   3   NA  NA  2   NA
4   NA  NA  9   4   NA
5   NA  NA  1   NA  5

我想返回一个只有两个数据列的数据框,每行的值:

id  val1    val2
1   10      1
2   6       10
3   3       2
4   9       4
5   1       5

这可以通过for 循环实现。但是我的真实数据非常大,所以我想做一个apply-like 函数。我所看到的一切都假设您知道您将使用哪些列。我尝试制作自己的单行函数,然后使用apply,但我一直收到错误“维度数不正确”。

【问题讨论】:

  • 没有外部库,完全矢量化。 t(apply(example, 1, function(x) x[!is.na(x)]))

标签: r dataframe apply


【解决方案1】:

试试

d1 <- setNames(data.frame(example$id,t(apply(example[-1], 1,
                        function(x) x[!is.na(x)]))),
                                 c('id', 'val1', 'val2'))
d1
#  id val1 val2
#1  1   10    1
#2  2    6   10
#3  3    3    2
#4  4    9    4
#5  5    1    5

或者您可以转换为“长”格式,然后再转换回“宽”

library(data.table)
dcast(melt(setDT(example), id.var='id', na.rm=TRUE)[,
           ind:=paste0('val', 1:.N) , id], id~ind, value.var='value')
#    id val1 val2
#1:  1   10    1
#2:  2    6   10
#3:  3    3    2
#4:  4    9    4
#5:  5    1    5

数据

example <- structure(list(id = 1:5, a = c(NA, 6L, 3L, NA, NA),
b = c(10L, 
NA, NA, NA, NA), c = c(NA, 10L, NA, 9L, 1L), d = c(NA, NA, 2L, 
4L, NA), e = c(1L, NA, NA, NA, 5L)), .Names = c("id", "a", "b", 
"c", "d", "e"), class = "data.frame", row.names = c(NA, -5L))

【讨论】:

    【解决方案2】:

    这应该是一种非常快速的方法:

    temp <- t(example[-1])  # Matrix of all columns other than the first, transposed
    cbind(example[1],       # Bind the first column with a two-column matrix
                            # created by using is.na and which
          matrix(temp[which(!is.na(temp), arr.ind = TRUE)], 
                 ncol = 2, byrow = TRUE))
    #   id  1  2
    # 1  1 10  1
    # 2  2  6 10
    # 3  3  3  2
    # 4  4  9  4
    # 5  5  1  5
    

    在对 500 万行数据集进行的快速测试中,它的执行速度比“data.table”和apply 方法都快。

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 2016-08-27
      • 1970-01-01
      • 2021-09-03
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多