根据 R 中几列的 TRUE/FALSE 创建新列

问题描述 投票:0回答:4

我是 R 新手,这是我的第一篇文章。请帮帮我。

我有一个包含 10 列的数据集,如下所示:

红色 蓝色 绿色
正确 错误 错误
正确 错误 错误
错误 正确 错误
错误 错误 正确

我想要一列应该看起来像:

颜色
红色
红色
蓝色
绿色

“真”应解读为该颜色。给定行中的各列中只有一个“True”。

我试过:

df <- df %>% add_column(color=ifelse(.$col_name == TRUE,colnames(df)[1],"")

红色 蓝色 绿色 col_1 col_2 col_3
正确 错误 错误 红色
正确 错误 错误 红色
错误 正确 错误 蓝色
错误 错误 正确 绿色

因此创建了 10 个额外的列,希望稍后合并它们。但我被困住了。有人可以帮忙吗?

谢谢!

r
4个回答
2
投票

如果你有一个逻辑数据框:

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)))])

0
投票

这里有

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
列。
方法 2: 使用列名称属性。

df %>%
  pivot_longer(everything(), names_to = "color") %>%
  filter(value) %>%
  select(color)

方法 3:子集列名称

df %>%
  mutate(color = names(.)[apply(., 1, which)])

0
投票

基本 R 方法,使用

ifelse
:

df$col_1 <- ifelse(df$Red, "Red", "")
df$col_2 <- ifelse(df$Blue, "Blue", "")
df$col_3 <- ifelse(df$Green, "Green", "")

0
投票

试试这个。

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")
© www.soinside.com 2019 - 2024. All rights reserved.