假设我有一个如下所示的数据框:
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
我想创建一个新列,根据顶部变量的排列和每个变量分配a
给f
类别.TRUE
FALSE
在这个简化的例子中,结果如下:
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
请注意,每个唯一的排列TRUE
和FALSE
变为不同的类别,并且由于a
并e
具有相同的排列,它们最终在同一类别(A
)中.
有没有一种简单的方法可以做到这一点,如果顶部有大量变量,可能会有效,并且可能不限于TRUE
,FALSE
但是如果数据框中填充了类别/数字?
你可以做点什么
## 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")