更改数据框中的一些数值

时间:2018-12-12 14:34:25

标签: r dplyr tidyr

我有一个数据框,其中两个变量(Lat和Lon)的值不正确。数据框中的错误值列出为999.00,正确的值应分别为42.68和-72.47。

我想使用dplyr替换这些值的简单方法,但是我的尝试(请参见下文)未成功(下面提供了错误)。

df$Lat2 <- recode(df$Lat, "999.00"="42.68", .default=x)
  

lapply(x,f)中的错误:找不到对象'x'

df <- df %>%
mutate(Lat2 = if_else(Lat == 999.00, 42.68, NULL, NULL))
  

mutate_impl(.data,点)中的错误:     评估错误:未使用的参数(recvLat = 999)。

df <- df %>%
mutate(Lat2 = ifelse(Lat == 999.00, 42.68, NULL))
  

mutate_impl(.data,点)中的错误:     评估错误:替换的长度为零。   另外:警告消息:   在rep(no,length.out = length(ans))中:     'x'为NULL,因此结果为NULL

df <- df %>%
mutate(Lat2 = case_when(Lat == 999.00 ~ 42.68, TRUE ~ NULL))
  

mutate_impl(.data,点)中的错误:     评估错误:下标超出范围。

对于后三种尝试,如果数字用引号引起来(例如“ 999.00”和“ 42.68”),我将得到相同的错误

3 个答案:

答案 0 :(得分:2)

为什么不使用它。

data=as.data.frame(matrix(0,3,3))
names(data)=c("a","b","c")
data$a[1]=999
data$c[2]=999
data$a[which(data$a==999)]=42.68
data$c[which(data$c==999)]=-72.47
data
      a b      c
1 42.68 0   0.00
2  0.00 0 -72.47
3  0.00 0   0.00

答案 1 :(得分:1)

实际上,这也是展示this.state = { type: getTypeName(props.defaultValue), // no assertion here value: this.props.defaultValue } 的优雅之处。

data.table

缺点是您必须记住library(data.table) ## Create example data <- data.table(lat = c(999, 0, 0), lon = c(0, 999, 0)) ## Reassign values data[lat==999, lat := 42.68] data[lon==999, lon := -72.47] ## Print results data # lat lon # 1: 42.68 0.00 # 2: 0.00 -72.47 # 3: 0.00 0.00 是分配所必需的。

上行是

  • 您可以按名称引用不带引号的变量
  • 高效存储,对于大型数据集尤其重要
  • 没有依赖项
  • :=语法更加简单和一致(i,j,分组依据)
  • 您不需要记住一堆带有怪异名称的功能,这些名称可能和/或可能不会拼写成澳大利亚风格(例如颜色或摘要)
  • 您可以更多地使用base R,这使您的代码更可移植且更易于理解
  • data.table类继承了data.frame类,因此它在R中更加兼容

答案 2 :(得分:0)

我们可以将NULL放在list

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, list(NULL)))
#  recvLat  Lat2
#1   999.0 42.68
#2     1.5  NULL
#3     2.5  NULL

它可以是NULL而不是NA

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, NA_real_))
#  recvLat  Lat2
#1   999.0 42.68
#2     1.5    NA
#3     2.5    NA

如果我们想做相反的事情,只需使用!=

df %>%
    mutate(Lat2 = ifelse(recvLat != 999.00, 42.68, NA_real_))

基于OP的评论,

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, recvLat))

base R中,我们可以通过创建索引来实现

i1 <- df$recvLat == 999
df$recLat[i1] <- 42.68

注意:两种解决方案均有效。

数据

df <- data.frame(recvLat = c(999, 1.5,  2.5))