[英]R: Conditional Replacement of values in several columns in data frame
我已經閱讀了幾篇關於此的帖子,但它們都適用於僅更改一列/變量。 我需要一次替換數據框中多列中的值。 我認為這應該有效,但事實並非如此,我不知道為什么。
positive <- c("Yes", "Science")
temp1 <- c("Yes", "No","","Science", "Only-Child")
temp2 <- c("Yes", "No",""," Yay people!", "Pessimist")
temp3 <- cbind(temp1,temp2)
colnames(temp3) <- c("Feature1","Feature2")
temp <- as.data.frame(temp3)
這不起作用:
for (i in temp) {
ifelse(i %in% positive, 1, i)
}
但是,在一個列上執行此操作有效:
test <- ifelse(temp$Feature1 %in% positive, 1, temp$Feature1)
test
所以我懷疑 i 不是我想要的,但檢查結果是我所期望的:
for (i in temp) {
print(i %in% positive)
}
輸出應如下所示:
Feature1 Feature2
1 1
No No
1 Yay people!
Only-Child Pessimist
那么我錯過了什么?
在您的示例中引起問題的第一件事是將字符串轉換為因子。 假設這是固定的,這里有一種方法可以獲取適當的索引並為它們分配 1:
temp <- as.data.frame(temp3, stringsAsFactors=FALSE)
temp[apply(temp, 2, function(x) x %in% positive)] <- 1
我的回答是基於對你所問內容的假設,因為你沒有具體說明你想要的結果是什么。
您的循環嘗試為所有i
返回ifelse(temp$Feature_i %in% positive, 1, temp$Feature_i)
。 但是,代碼將嘗試為每個“列”返回一個向量,其中包含1
或相應的temp
“列”。 這將不起作用,因為 ifelse 是一個向量化函數,這意味着它可以 - 與if
語句相反 - 支持布爾變量向量作為輸入(問題+1)。 但是由於每個向量化函數都返回一個向量,因此該向量中的所有值都屬於同一類(R 會自動進行轉換)。 在您的情況下, temp$Feature_i
是一個因子向量,並且相應的數字轉換是由向量中因子的索引完成的。 因此我無法理解您的ifelse
查詢。
如果您想准確更改temp
中包含positive
那些輸入,並且您想知道要更改哪些元素(如果這是您的意圖),那么您必須從以下開始(使用sapply
,因為它通常比 for 循環更快) :
sapply(temp, function(x) x %in% positive)
Feature1 Feature2
[1,] TRUE TRUE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] TRUE FALSE
[5,] FALSE FALSE
但是,如果您嚴格需要您在第三個代碼塊中建議的輸出,那么請執行
sapply(temp, function(x) ifelse(x %in% positive,1,x))
Hth, D
解決方法如下:
sapply(temp, function(x) ifelse(x %in% positive,1,as.character(x)))
for 循環中可能存在范圍界定問題。 嘗試
test <- (temp == "Yes" | temp == "Science")
(我假設您想要 true 或 false 語句作為輸出,對嗎?如果不是,最好添加一個示例,說明您希望最終數據框的外觀。)
編輯:
首先將其轉換為矩陣似乎有幫助。 嘗試:
ind <- (temp == "Yes" | temp == "Science")
tmp <- as.matrix(temp)
tmp[ind] <- 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.