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