簡體   English   中英

如果一列中的觀察值等於 R 中另一列的名稱,則循環分配一個值

[英]Loop to assign a value if an observation in one column is equal to other column's name in R

我有一個向量和一個數據集,類似於:

id_vector <- as.character(c("n01", "n02", "n03"))
df_1 <- data.frame("id" = c("n01", "n02", "n02", "n03"), "n01" = NA, "n02" = NA,  "n03" = NA)
df_1$id <- as.character(df_1$id)

我希望數據集是:

df_2 <- data.frame("id" = c("n01", "n02", "n02", "n03"), "n01" = c(1, NA, NA, NA), "n02" = c(NA, 1, 1, NA),  "n03" = c(NA, NA, NA, 1))

解決方案應該很簡單,例如:

for (i in id_vector){
  df_1[i][df_1$id == i] <- 1
}

但是,我不能使用兩個 []。 錯誤是:

Error in `[<-.data.frame`(`*tmp*`, df_1$id == i, value = 1) : 
duplicate subscripts for columns 

有什么幫助嗎?

謝謝!

在這里,我們可以用[[對向量進行子集化。 df_1[1]仍然是具有單列的data.frame

for (i in id_vector){
   df_1[[i]][df_1$id == i] <- 1
  }

identical(df_1, df_2)
#[1] TRUE

您可以創建一個行/列矩陣以將值更改為 1。

df_1[id_vector][cbind(seq_len(nrow(df_1)), match(df_1$id, id_vector))] <- 1
df_1

#   id n01 n02 n03
#1 n01   1  NA  NA
#2 n02  NA   1  NA
#3 n02  NA   1  NA
#4 n03  NA  NA   1

為了解釋上面的內容,我們使用match來獲取要替換的列號,而seq_len(nrow(df_1))給我們一個序列1:nrow(df) 使用cbind我們將它們轉換為矩陣。

cbind(seq_len(nrow(df_1)), match(df_1$id, id_vector))
#     [,1] [,2]
#[1,]    1    1
#[2,]    2    2
#[3,]    3    2
#[4,]    4    3

現在我們僅對id_vector列進行子集化,基於上述矩陣對 dataframe 進行子集化並將值分配為 1。

暫無
暫無

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

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