【问题标题】:Separate data frame into ID columns (with only one unique value), and variable columns (with more than one value)将数据框分为 ID 列(只有一个唯一值)和变量列(具有多个值)
【发布时间】:2020-04-02 11:12:16
【问题描述】:

我有一个数据框,其中包含多个 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 package (v0.3.0) 于 2020 年 4 月 2 日创建

【问题讨论】:

  • 第一步可能是循环遍历列而不是遍历列名。然后你保存一个sapplycol_ix &lt;- sapply(mydf, function(x) length(unique(x)) == 1); mydf[col_ix]; mydf[!col_ix]。或者使用索引拆分成列表:split.default(mydf, sapply(mydf, function(x) length(unique(x)) == 1)).
  • 是的,我在循环名称时过于复杂了! @Henrik如果您不介意为此获得一些代表,您可以将其作为答案:)
  • @henrik split.default 疯了。不知道这个。感谢分享

标签: r


【解决方案1】:

一个非常非常短的方法是

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

【讨论】:

  • 使用lengths 是个好主意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多