我有一个数据框,其中有三个可能的值,“ Up”,“ Down”或NA。
dim(df)= 61,5
我想用+2替换所有“向上”值
所有“下降”值都减到-2
所有NA值均为0
我已经创建了以下函数,但我不断收到此错误:
Binaryexpress <- function(x){
for(i in 1:5){
j<-1
while(j<= 61){
if (x[j,i] == "Down"){
x[j,i] <- -2
j <- j+1
} else if(x[j,i] == "Up"){
x[j,i] <- 2
j<- j+1
}else if(is.na(x[j,i]) == TRUE){
x[j,i] <- 0
j<- j+1
}
i<- i+1
}
}
}
Error in if (x[j, i] == "Down") { : missing value where TRUE/FALSE needed
我也在论坛上尝试了其他方法,例如-> df [df == NA] <-0,但这也没有用。
编辑::
数据框如下所示:
x1 x2 x3 x4 x5
y Up Down NA NA Up
k Down NA Up NA NA
l . . . . .
m . . . . .
.
.
谢谢大家
答案 0 :(得分:4)
您不需要任何。
db[db=="Up"] <- 2
db[db=="Down"] <- -2
db[is.na(db)] <- 0
基本上,您正在数据库(我称为db)中搜索“向上”,“向下”或NA,并分别分配2,-2和0。
这将使您拥有所有字符,因此您可以这样做:
db<-as.data.frame(sapply(db,as.numeric))
在您的评论中,您说它给了您一个因数错误-这意味着您的df是所有因数。首先解决此问题:
db<-as.data.frame(sapply(db,as.character),stringsAsFactors = F)
答案 1 :(得分:2)
使用dplyr
library(dplyr)
df <- data.frame(x1 = sample(c('up', 'down', NA), 61, replace = TRUE),
x2 = sample(c('up', 'down', NA), 61, replace = TRUE),
x3 = sample(c('up', 'down', NA), 61, replace = TRUE),
x4 = sample(c('up', 'down', NA), 61, replace = TRUE),
x5 = sample(c('up', 'down', NA), 61, replace = TRUE))
first convert everything to string:
df %>%
mutate_all(as.character) %>%
replace(., . == 'up', 2) %>%
replace(., . == 'down', -2) %>%
replace(., is.na(.), 0)
答案 2 :(得分:2)
如果您有字符数据(例如,如MattW的回答所示),则这种愚蠢的方法有效:
df[] <- match(unlist(df), c("Down", NA, "Up"))*2L - 4L
它分别匹配Down,NA,Up,1、2、3,然后算术将1,2,3映射到-2,0,2。
不过,我认为这不是安排数据的好方法。当许多(或全部)列包含相关数据时,最好使用矩阵或将数据放入“长格式”。
答案 3 :(得分:1)
这是使用vapply
的更干净的解决方案,因此您可以确切了解正在发生的事情:
db <- data.frame(
x1 = as.factor(c('Up', 'Up', 'Down', NA)),
x2 = as.factor(c('Up', 'Down', NA, 'Down'))
)
numerize <- function(x){
ifelse(is.na(x), 0, ifelse(x == 'Up', 2, ifelse(x == 'Down', -2, NA)))
}
db$x1 <- vapply(db$x1, numerize, 0)
db$x2 <- vapply(db$x2, numerize, 0)
答案 4 :(得分:0)
如果要坚持以R为基数,则编写一个函数来替换一列,然后将该函数应用于所有列。
df <- data.frame(
x1 = sample(c("Up", "Down", NA), 10, replace = TRUE),
x2 = sample(c("Up", "Down", NA), 10, replace = TRUE),
x3 = sample(c("Up", "Down", NA), 10, replace = TRUE),
x4 = sample(c("Up", "Down", NA), 10, replace = TRUE),
x5 = sample(c("Up", "Down", NA), 10, replace = TRUE),
stringsAsFactors = FALSE
)
recode_vals <- function(df, col) {
df[[col]] <- ifelse(is.na(df[col]), 0,
ifelse(df[col] == "Up", 2, -2))
df[[col]]
}
df3 <- sapply(colnames(df), function(nm) recode_vals(df, nm))
答案 5 :(得分:0)
我将使用经过适当转换的因子转换为数值::
set.seed(1)
df <- data.frame(x1 = sample(c('Up', 'Down', NA), 5, replace = TRUE),
x2 = sample(c('Up', 'Down', NA), 5, replace = TRUE),
x3 = sample(c('Up', 'Down', NA), 5, replace = TRUE))
df
# x1 x2 x3
# 1 Up <NA> Up
# 2 Down <NA> Up
# 3 Down Down <NA>
# 4 <NA> Down Down
# 5 Up Up <NA>
df[] <- lapply(df,function(x) (as.numeric(factor(x,c("Down", NA, "Up"),exclude=NULL))-2)*2)
df
# x1 x2 x3
# 1 2 0 2
# 2 -2 0 2
# 3 -2 -2 0
# 4 0 -2 -2
# 5 2 2 0