用数字替换值

时间:2018-07-23 19:18:29

标签: r dataframe

我有一个数据框,其中有三个可能的值,“ 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 .     .    .     .     .
.
.

谢谢大家

6 个答案:

答案 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