假设我有一个如下所示的数据框:
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
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列,根据顶部变量的排列和每个变量分配a给f类别.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
Run Code Online (Sandbox Code Playgroud)
请注意,每个唯一的排列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
Run Code Online (Sandbox Code Playgroud)
如果我们使用命名列表作为环境,上面的代码可以写成一行代码.这样可以避免对全局环境进行任何新的分配.
df$category <- LETTERS[with(list(x = do.call(paste, df)), match(x, x))]
Run Code Online (Sandbox Code Playgroud)
数据:
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")
Run Code Online (Sandbox Code Playgroud)