![](/img/trans.png)
[英]How to extract observations from a data frame and make a table showing observations, column name, and row name?
[英]How to rename observations by column name in data frame?
我有一個類似於以下內容的數據框:
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
這可能嗎?
您可以嘗試使用purrr
中的imap
:
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]))
一個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
這行得通嗎:
> 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
>
我們可以在一行中完成
library(tidyr)
df1[-1] <- replace_na(names(df1)[-1][NA^(df1[-1] != 1) * col(df1[-1])], 0)
-輸出
df1
# 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
或者使用base R
i1 <- df1[-1] == 1
df1[-1][i1] <- names(df1)[-1][col(df1[-1])][i1]
df1 <- structure(list(Name = c("Joe Smith", "Dave Thomas", "Alex Smith",
"Eric Jones"), L06 = c(1L, 0L, 0L, 1L), R12 = c(0L, 1L, 0L, 0L
), L02 = c(0L, 1L, 1L, 0L)), class = "data.frame", row.names = c(NA,
-4L))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.