簡體   English   中英

R:有條件地替換數據框中幾列中的值

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

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