当前位置:  开发笔记 > 编程语言 > 正文

如何根据其他列的排列在数据框中创建新列?

如何解决《如何根据其他列的排列在数据框中创建新列?》经验,为你挑选了1个好方法。

假设我有一个如下所示的数据框:

    var1   var2   var3   var4  
a   TRUE   FALSE  TRUE   FALSE
b   TRUE   TRUE   TRUE   FALSE
c   FALSE  TRUE   FALSE  TRUE
d   TRUE   FALSE  FALSE  FALSE
e   TRUE   FALSE  TRUE   FALSE
f   FALSE  TRUE   FALSE  TRUE

我想创建一个新列,根据顶部变量的排列和每个变量分配af类别.TRUEFALSE

在这个简化的例子中,结果如下:

    var1   var2   var3   var4    category
a   TRUE   FALSE  TRUE   FALSE      A
b   TRUE   TRUE   TRUE   FALSE      B
c   FALSE  TRUE   FALSE  TRUE       C
d   TRUE   FALSE  FALSE  FALSE      D
e   TRUE   FALSE  TRUE   FALSE      A
f   FALSE  TRUE   FALSE  TRUE       C

请注意,每个唯一的排列TRUEFALSE变为不同的类别,并且由于ae具有相同的排列,它们最终在同一类别(A)中.

有没有一种简单的方法可以做到这一点,如果顶部有大量变量,可能会有效,并且可能不限于TRUE,FALSE但是如果数据框中填充了类别/数字?



1> Rich Scriven..:

你可以做点什么

## paste the rows together, creating a character vector
x <- do.call(paste, df)
## match it against itself and apply to 'LETTERS', and assign as new column
df$category <- LETTERS[match(x, x)]
df
#    var1  var2  var3  var4 category
# a  TRUE FALSE  TRUE FALSE        A
# b  TRUE  TRUE  TRUE FALSE        B
# c FALSE  TRUE FALSE  TRUE        C
# d  TRUE FALSE FALSE FALSE        D
# e  TRUE FALSE  TRUE FALSE        A
# f FALSE  TRUE FALSE  TRUE        C

如果我们使用命名列表作为环境,上面的代码可以写成一行代码.这样可以避免对全局环境进行任何新的分配.

df$category <- LETTERS[with(list(x = do.call(paste, df)), match(x, x))]

数据:

df <- structure(list(var1 = c(TRUE, TRUE, FALSE, TRUE, TRUE, FALSE), 
    var2 = c(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), var3 = c(TRUE, 
    TRUE, FALSE, FALSE, TRUE, FALSE), var4 = c(FALSE, FALSE, 
    TRUE, FALSE, FALSE, TRUE)), .Names = c("var1", "var2", "var3", 
"var4"), row.names = c("a", "b", "c", "d", "e", "f"), class = "data.frame")


`LETTERS [with(list(x = interaction(df)),match(x,x))]`作为一个简单的简化.
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有