我是 R 新手,这是我的第一篇文章。请帮帮我。
我有一个包含 10 列的数据集,如下所示:
红色 | 蓝色 | 绿色 |
---|---|---|
正确 | 错误 | 错误 |
正确 | 错误 | 错误 |
错误 | 正确 | 错误 |
错误 | 错误 | 正确 |
我想要一列应该看起来像:
颜色 |
---|
红色 |
红色 |
蓝色 |
绿色 |
“真”应解读为该颜色。给定行中的各列中只有一个“True”。
我试过:
df <- df %>% add_column(color=ifelse(.$col_name == TRUE,colnames(df)[1],"")
红色 | 蓝色 | 绿色 | col_1 | col_2 | col_3 |
---|---|---|---|---|---|
正确 | 错误 | 错误 | 红色 | ||
正确 | 错误 | 错误 | 红色 | ||
错误 | 正确 | 错误 | 蓝色 | ||
错误 | 错误 | 正确 | 绿色 |
因此创建了 10 个额外的列,希望稍后合并它们。但我被困住了。有人可以帮忙吗?
谢谢!
如果你有一个逻辑数据框:
cbind(df, col = names(df)[max.col(df1)])
Red Blue Green col
1 True False False Red
2 True False False Red
3 False True False Blue
4 False False True Green
另一方面,如果您有上述数据,那么:
df1 <- df #THIS IS TO ENSURE YOU MAINTAIN YOUR ORIGINAL DATAFRAME
df1[]<-as.logical(as.matrix(df1))
cbind(df1, color = names(df)[max.col(df1)])
Red Blue Green color
1 TRUE FALSE FALSE Red
2 TRUE FALSE FALSE Red
3 FALSE TRUE FALSE Blue
4 FALSE FALSE TRUE Green
如果复制数据的成本很高,那么:
cbind(df, col = names(df)[max.col(array(as.logical(unlist(df)), dim(df)))])
这里有
tidyverse
方法。
df = tibble(Red = c(T,T,F,F), Blue = c(F,F,T,F), Green = c(F,F,F,T))
方法 1:
case_when
,向量化的多个 if - else。
df %>%
mutate(color = case_when(Red ~ "Red",
Blue ~ "Blue",
Green ~ "Green"))
将
mutate
与 transmute
交换,仅返回新的 color
列。df %>%
pivot_longer(everything(), names_to = "color") %>%
filter(value) %>%
select(color)
方法 3:子集列名称
df %>%
mutate(color = names(.)[apply(., 1, which)])
基本 R 方法,使用
ifelse
:
df$col_1 <- ifelse(df$Red, "Red", "")
df$col_2 <- ifelse(df$Blue, "Blue", "")
df$col_3 <- ifelse(df$Green, "Green", "")
试试这个。
library(tidyverse)
df <- tibble(Red = c(T,T,F,F), Blue = c(F,F,T,F), Green = c(F,F,F,T))
df %>%
pivot_longer(Red:Green, names_to = "color", values_to = "logical")