首页 > 解决方案 > 将数据框分为 ID 列(只有一个唯一值)和变量列(具有多个值)

问题描述

我有一个数据框,其中包含几个 ID 列,其中仅包含一个唯一值和实际包含变量的列。如何将它们分开?

我在 sapply 中使用条件语句提出了以下方法,但我想知道是否有更优雅的方法来做到这一点?

我对任何包以及数据帧分开的任何输出都很满意,这也可以在列表中。不需要将每个帧分配给一个新对象。

mydf <- data.frame(a = 'a', b = 'b', val1 = 1:10, val2 = 10:1)

head(mydf,3)
#>   a b val1 val2
#> 1 a b    1   10
#> 2 a b    2    9
#> 3 a b    3    8

id_cols <- mydf[sapply(names(mydf), function(x) {length(unique(mydf[[x]])) == 1})]

variable_cols <- mydf[sapply(names(mydf), function(x) {length(unique(mydf[[x]])) != 1})]

head(id_cols, 3)
#>   a b
#> 1 a b
#> 2 a b
#> 3 a b

head(variable_cols, 3)
#>   val1 val2
#> 1    1   10
#> 2    2    9
#> 3    3    8

reprex 包(v0.3.0)于 2020 年 4 月 2 日创建

标签: r

解决方案


一个非常非常短的方法是

Var           = lengths(lapply(mydf, unique)) > 1
id_cols       = mydf[, Var]
variable_cols = mydf[, !Var]

推荐阅读