簡體   English   中英

R 根據 rownames 值將列值添加到 dataframe

[英]R add column values to dataframe based on rownames values

我需要向 dataframe 添加一列,以反映行名中編碼的信息。 以下是說明問題的最小示例。

例子:

df <- data.frame(c(1,2,3,4),c(0,1,0,1))
colnames(df) <- c("Value","Ident")
rownames(df) <- c("fish1_101","fish1_102","fish2_103","fish2_104")
df

行名中編碼的是關於每個樣本的信息。 在此示例中,“fish1”前綴表示鮭魚,而“fish2”前綴表示翻車魚。

我需要添加一個新列“fish_species”,指定正確的魚種。

試圖:

key_df <- data.frame(c("fish1","fish2","fish3"),c("salmon","sunfish","halibut"))
colnames(key_df) <- c("key","species")

df["species"] <- apply(df, 1, function(x){
NameFound <- x[3]
NameFound_split <- unlist(strsplit(NameFound, "_"))
if (NameFound_split[1] == "fish1"){
out <- "salmon"
} else if (NameFound_split[1] == "fish2") {
out <- "sunfish"
} else if (NameFound_split[1] == "fish3") {
out <- "halibut"
}
return(out)
})

df <- df[,c(1,2,4)]
df # This is the desired result.

我正在尋找一種更清潔、更高吞吐量的方法來執行此操作,其中每個身份都不需要 if 語句。

df %>%
  rownames_to_column('key')%>%
  mutate(key = str_remove(key, '_.*'))%>%
  left_join(key_df, by = 'key')

    key Value Ident species
1 fish1     1     0  salmon
2 fish1     2     1  salmon
3 fish2     3     0 sunfish
4 fish2     4     1 sunfish

一個可能的解決方案:

library(tidyverse)

df <- data.frame(c(1,2,3,4),c(0,1,0,1))
colnames(df) <- c("Value","Ident")
rownames(df) <- c("fish1_101","fish1_102","fish2_103","fish2_104")

df %>% 
  rownames_to_column("fish_species") %>% 
  mutate(fish_species = if_else(str_detect(fish_species,"fish1"), "salmon", "sunfish"))

#>   fish_species Value Ident
#> 1       salmon     1     0
#> 2       salmon     2     1
#> 3      sunfish     3     0
#> 4      sunfish     4     1

使用match嘗試以下基本 R 選項

df$species <- with(
  key_df,
  species[match(gsub("_.*", "", rownames(df)), key)]
)

你會得到

> df
          Value Ident species
fish1_101     1     0  salmon
fish1_102     2     1  salmon
fish2_103     3     0 sunfish
fish2_104     4     1 sunfish

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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