【问题标题】:R Programming: Condition giving always TRUER编程:条件给出总是TRUE
【发布时间】:2015-12-02 22:57:42
【问题描述】:

我试图让最后一列从第 5 列获取数据。如果字符是“M”,它应该做某事,如果“F”是别的,这是我的代码:

wd="c:/users/Youssef/Documents/Fares/R/employes.txt";
setwd(wd);
employes=read.table("c:/users/Youssef/Documents/Fares/R/employes.txt", sep=" ")
employes["PRIMES"] <- NA
x = "M"
ifelse(employes$V3==x, employes$PRIMES <- employes$V5*2, employes$PRIMES <- employes$V5*3)
employes

这是我的文本文件:

AD5522 42 M 42000 10
BR4230 39 F 38000 12
CC0563 39 F 35000 14
DL3222 24 M 28000 2
EM0157 43 M 38000 15
FG5441 62 M 45000 28
GG0575 27 M 44000 4
HD4410 55 F 30000 2
IA1203 32 F 28000 4
JO9876 24 F 24000 2
KJ3481 42 M 40000 8
LL1101 34 M 42000 10
MM0157 56 M 87000 15
ZD5431 34 M 54000 28
SF0325 73 M 33000 4
LK4200 61 F 23000 2
PI1243 26 F 74000 4
NB9809 42 F 64000 2
XF3111 71 M 12000 8
AL1190 23 M 53000 10

我想要做的是创建一个名为 PRIMES 的新列,并将第 5 列的值加倍,如果是 M,则将其放在那里,如果是 F,则将其加倍。但是我的代码所做的是将所有内容加倍,就好像它只读取第一个 M 并将每个数字乘以 3 并将其放在 PRIMES 列上

【问题讨论】:

  • ifelse 的语法不正确。
  • 我认为前两行没用,所以不要介意
  • @Pascal 如果我打印 ("Male") 和打印 ("Female") 而不是替换列上的数据,它就可以工作。唯一的问题是它在打印整行之前会额外打印男性和女性 1 次。
  • 查看下面的答案以了解正确的语法。

标签: r


【解决方案1】:

ifelse 产生一个向量。你想要这个:

employes$PRIMES <- ifelse(employes$V3==x,  employes$V5*2, employes$V5*3)

或者更简单有效(感谢@Richard)

employes$PRIMES <- employes$V5 * ifelse(employes$V3==x, 2, 3)

这会创建一个由23 组成的向量以用于乘法运算。

【讨论】:

  • employes$V5 * ifelse(employes$V3==x, 2, 3) 在更好的包中是一样的
  • 我喜欢employes &lt;- transform(employes, PRIMES=V5*ifelse(V3==x,2,3))
  • 或者(开个玩笑)PRIMES=V5*(3-as.numeric(V3==x))
  • @BenBolker - 为什么开玩笑? V5 * (3 - (V3 == "M")) 对我来说似乎非常好。
  • 这些解决方案对我来说太聪明/太棘手了。我觉得这样的代码不容易阅读。
【解决方案2】:

这是一种 dplyr 方式:

library(dplyr)

data = 
  employes %>%
  setNames(c("ID", "age", "gender", "long", "short"))

gender_key = data_frame(
  gender = c("M", "F"),
  multiplier = c(2, 3) )

result = 
  data %>%
  left_join(gender_key) %>%
  mutate(new_short = short * multiplier)

【讨论】:

  • 感谢您的帮助。我不知道谁给了你不好的反馈...由于某些原因我无法投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多