我有一个类似于以下内容的数据框架:
Name L06 R12 L02
Joe Smith 1 0 0
Dave Thomas 0 1 1
Alex Smith 0 0 1
Eric Jones 1 0 0我希望将值为1的观察重新命名为其列的名称。请注意,我将只重命名某些列(此处列2-4)。
Name L06 R12 L02
Joe Smith L06 0 0
Dave Thomas 0 R12 L02
Alex Smith 0 0 L02
Eric Jones L06 0 0这个是可能的吗?
发布于 2020-10-24 15:27:06
您可以尝试使用来自purrr的purrr:
cols <- 2:4
df[cols] <- purrr::imap(df[cols], ~replace(.x, .x == 1, .y))
df
# Name L06 R12 L02
#1 JoeSmith L06 0 0
#2 DaveThomas 0 R12 L02
#3 AlexSmith 0 0 L02
#4 EricJones L06 0 0在基本R中,可以使用Map:
df[cols] <- Map(function(x, y) replace(x, x == 1, y), df[cols], names(df[cols]))发布于 2020-10-24 15:45:52
一种base R方法
df[df==1] <-t(replicate(nrow(df),colnames(df)))[df==1]给予,
Name L06 R12 L02
1 Joe Smith L06 0 0
2 Dave Thomas 0 R12 L02
3 Alex Smith 0 0 L02
4 Eric Jones L06 0 0发布于 2020-10-24 15:41:41
这是否有效:
> library(dplyr)
> library(tidyr)
> df %>% pivot_longer(-Name, names_to = 'LR', values_to = 'Ones') %>%
+ mutate(val = case_when(Ones == 1 ~ LR, TRUE ~ NA_character_)) %>%
pivot_wider(id_cols = Name, names_from = LR, values_from = val) %>%
+ mutate(across(2:4, ~replace_na(., '0')))
# A tibble: 4 x 4
Name L06 R12 L02
<chr> <chr> <chr> <chr>
1 Joe Smith L06 0 0
2 Dave Thomas 0 R12 L02
3 Alex Smith 0 0 L02
4 Eric Jones L06 0 0
> https://stackoverflow.com/questions/64514968
复制相似问题