我已经阅读了几篇关于此的帖子,但它们都只适用于更改一个列/变量。我需要立即替换数据框中多个列中的值。我认为这应该有用,但事实并非如此,我无法弄清楚原因。
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
那么我错过了什么?
答案 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