R:条件替换数据框中多列中的值

时间:2014-04-16 11:23:08

标签: r conditional

我已经阅读了几篇关于此的帖子,但它们都只适用于更改一个列/变量。我需要立即替换数据框中多个列中的值。我认为这应该有用,但事实并非如此,我无法弄清楚原因。

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

所以我怀疑我不是我想要的,但检查结果符合我的预期:

for (i in temp) {
  print(i %in% positive)
}

输出应如下所示:

  Feature1     Feature2
         1            1
        No           No

         1  Yay people!
Only-Child    Pessimist

那么我错过了什么?

3 个答案:

答案 0 :(得分:1)

在您的示例中导致问题的第一件事是将字符串转换为因子。假设已经修复,这里有一种方法可以获得适当的索引并为它们分配1:

temp <- as.data.frame(temp3, stringsAsFactors=FALSE)
temp[apply(temp, 2, function(x) x %in% positive)] <- 1

答案 1 :(得分:1)

我的回答是基于你所问的假设,因为你没有具体说明你想要的结果是什么。

您的循环尝试为所有ifelse(temp$Feature_i %in% positive, 1, temp$Feature_i)返回i。但是,代码将尝试返回带有1或相应的&#34;列的向量&#34;每个&#34;列&#34;的temp。这是行不通的,因为ifelse是一个向量化函数,这意味着它可以 - 而不是if语句 - 支持布尔变量向量作为输入(问题为+1)。但由于每个向量化函数都返回一个向量,因此该向量中的所有值都属于同一类(R自动进行转换)。在您的情况下,temp$Feature_i是因子的向量,并且相应的数字转换由向量中的因子的索引完成。因此,我无法理解您的ifelse查询。

如果您想要更改temp中包含positive的输入,并且您想知道要更改哪些元素(如果这是您的意图)那么您就拥有了从以下开始(使用sapply因为通常比循环更快):

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))

H个, d


解决方案如下:

sapply(temp, function(x) ifelse(x %in% positive,1,as.character(x)))

答案 2 :(得分:0)

for-loop中可能存在一个范围问题。试试

test <- (temp == "Yes" | temp == "Science")

(我假设您需要将真或假语句作为输出,对吧?如果没有,最好添加一个您希望最终数据帧看起来如何的示例。)

编辑:

首先将其转换为矩阵似乎有所帮助。试试:

ind <- (temp == "Yes" | temp == "Science")
tmp <- as.matrix(temp)
tmp[ind] <- 1