簡體   English   中英

如何按數據框中的列名重命名觀察結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM