将多列值折叠为 1 个因子
colapse multiple columns values into 1 factor
是否有将多个列值合并为 1 个因子的函数?
每条记录的列 2:4 恰好有 1 个 TRUE 值。
记录的结果值应该是具有真实值的列名。
输入数据框:
data <- data.frame(user=c(1,2,3,4), blue=c(T,F,T,F), green=c(F,F,F,T), red=c(F,T,F,F))
user blue green red
1 1 TRUE FALSE FALSE
2 2 FALSE FALSE TRUE
3 3 TRUE FALSE FALSE
4 4 FALSE TRUE FALSE
预期输出:
user color
1 1 blue
2 2 red
3 3 blue
4 4 green
cbind(data[1], color = apply(data[-1], 1, function(x) names(data[-1])[x]))
user color
1 1 blue
2 2 red
3 3 blue
4 4 green
你可以试试这个:
data$named.colors <- factor(apply(data[,2:4], 1, function(row) which(row == T)), labels = c("blue", "green", "red"))
它遍历每一行,找到为真的列,然后将其转化为一个因子。
这是使用我维护的 qdapTools 包的方法:
library(qdapTools)
data[["color"]] <- unlist(counts2list(data[-1]))
## user blue green red color
## 1 1 TRUE FALSE FALSE blue
## 2 2 FALSE FALSE TRUE red
## 3 3 TRUE FALSE FALSE blue
## 4 4 FALSE TRUE FALSE green
如果您只想 user
和 color
使用 data[c(1, 5)]
建议你看看tidyr
包中的gather
函数。
require("tidyr")
require("dplyr")
data %>% gather(color, TF, -user) %>% filter(TF == T) %>% select(-TF) %>% arrange(user)
# user color
# 1 1 blue
# 2 2 red
# 3 3 blue
# 4 4 green
是否有将多个列值合并为 1 个因子的函数? 每条记录的列 2:4 恰好有 1 个 TRUE 值。 记录的结果值应该是具有真实值的列名。
输入数据框:
data <- data.frame(user=c(1,2,3,4), blue=c(T,F,T,F), green=c(F,F,F,T), red=c(F,T,F,F))
user blue green red
1 1 TRUE FALSE FALSE
2 2 FALSE FALSE TRUE
3 3 TRUE FALSE FALSE
4 4 FALSE TRUE FALSE
预期输出:
user color
1 1 blue
2 2 red
3 3 blue
4 4 green
cbind(data[1], color = apply(data[-1], 1, function(x) names(data[-1])[x]))
user color
1 1 blue
2 2 red
3 3 blue
4 4 green
你可以试试这个:
data$named.colors <- factor(apply(data[,2:4], 1, function(row) which(row == T)), labels = c("blue", "green", "red"))
它遍历每一行,找到为真的列,然后将其转化为一个因子。
这是使用我维护的 qdapTools 包的方法:
library(qdapTools)
data[["color"]] <- unlist(counts2list(data[-1]))
## user blue green red color
## 1 1 TRUE FALSE FALSE blue
## 2 2 FALSE FALSE TRUE red
## 3 3 TRUE FALSE FALSE blue
## 4 4 FALSE TRUE FALSE green
如果您只想 user
和 color
使用 data[c(1, 5)]
建议你看看tidyr
包中的gather
函数。
require("tidyr")
require("dplyr")
data %>% gather(color, TF, -user) %>% filter(TF == T) %>% select(-TF) %>% arrange(user)
# user color
# 1 1 blue
# 2 2 red
# 3 3 blue
# 4 4 green