所以我使用R并尝试通过比较两列来更改一列中数据框中的值。我有类似
的东西Median MyPrice
10 0
20 18
20 20
30 35
15 NA
我想说点什么
if(MyPrice == 0 & MyPrice < Median){MyPrice <- 1
}else if (MyPrice == Median){MyPrice <- 2
}else if (MyPrice > Median){MyPrice <- 3
}else {MyPrice <- 4}
提出
Median MyPrice
10 1
20 1
20 2
30 3
15 4
但总是有错误。我也试过像
这样的东西for(i in MyPrice){if(MyPrice == 0 & MyPrice < Median){MyPrice <- 1
}else if (MyPrice == Median){MyPrice <- 2
}else if (MyPrice > Median){MyPrice <- 3
}else {MyPrice <- 4}
}
for循环运行,但是它将MyPrice中的所有值都更改为4.我也尝试了ifelse()函数,但它似乎有一个问题,一次接受多个参数。
如果像这样的解决方案更容易,我也不会反对将新列添加到数据框的末尾。
答案 0 :(得分:1)
您不一定要使用for
循环。首先将每个比较设置为4。
> x$Comp=4
> x$Comp[x$Median>x$MyPrice]=1 #if Median is higher, comparison = 1
> x$Comp[x$Median==x$MyPrice]=2 #if Median is equal to MyPrice, comparison = 2
> x$Comp[x$Median<x$MyPrice]=3 #if Median is lower, comparison = 3
> x
Median MyPrice Comp
1 10 0 1
2 20 18 1
3 20 20 2
4 30 35 3
5 15 NA 4
答案 1 :(得分:1)
鉴于您的第一个论点是MyPrice == 0 & MyPrice < Median
,您的第二行中位数:20
和MyPrice:18
也应该是4
。这是一个带有NA处理程序的工作嵌套ifelse语句。
df <- as.data.frame(matrix(c(10,0,20,18,20,20,30,35,15,NA), byrow = T, ncol = 2))
colnames(df) <- c("Median","MyPrice")
df$NewPrice <- ifelse(df$MyPrice == 0 & df$MyPrice < df$Median, 1,
ifelse(df$MyPrice == df$Median, 2,
ifelse(df$MyPrice > df$Median, 3, 4)))
df$NewPrice[is.na(df$MyPrice)] <- 4
df
# Median MyPrice NewPrice
#1 10 0 1
#2 20 18 4
#3 20 20 2
#4 30 35 3
#5 15 NA 4
答案 2 :(得分:0)
如何用4中的所有值设置一个新变量,然后替换那些符合您的条件的情况? 简单,直接,易于阅读:-)
#(以@Evans Friedland为例) df <-as.data.frame(matrix(c(10,0,20,18,20,20,30,35,15,NA),byrow = T,ncol = 2)) colnames(df)<-c(“ Median”,“ MyPrice”)
df <-mutate(df,myNewPrice = 4)#将新价格设置为4,然后根据您的条件进行编辑
df $ myNewPrice <-替换(df $ myNewPrice,df $ MyPrice == 0&df $ MyPrice
df $ myNewPrice <-as.numeric(df $ myNewPrice)#might,可能不需要。