【发布时间】: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 日创建
【问题讨论】:
-
第一步可能是循环遍历列而不是遍历列名。然后你保存一个
sapply;col_ix <- 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