【问题标题】:Using ifelse statement to condense variables使用 ifelse 语句压缩变量
【发布时间】:2014-09-26 23:38:25
【问题描述】:

R 新手,以极少的指令参加非常快速的课程。所以如果这是一个菜鸟问题,我提前道歉。

我的任务是从数据框中获取一个具有 21 个级别的特定列,并使用 if 或 ifelse 语句将它们压缩为 4 个级别。我已经尝试了数百种组合,但这是最有希望的代码:

> b2$LANDFORM=ifelse(b2$LANDFORM=="af","af_type",
        ifelse(b2$LANDFORM=="aflb","af_type",
        ifelse(b2$LANDFORM=="afub","af_type",
        ifelse(b2$LANDFORD=="afwb","af_type",
        ifelse(b2$LANDFORM=="afws","af_type",
        ifelse(b2$LANDFORM=="bfr","bf_type",
        ifelse(b2$LANDFORM=="bfrlb","bf_type",
        ifelse(b2$LANDFORM=="bfrwb","bf_type",
        ifelse(b2$LANDFORM=="bfrwbws","bf_type",
        ifelse(b2$LANDFORM=="bfrws","bf_type",
        ifelse(b2$LANDFORM=="lb","lb_type",
        ifelse(bs$LANDFORM=="lbaf","lb_type",
        ifelse(b2$LANDFORM=="lbub","lb_type",
        ifelse(b2$LANDFORM=="lbwb","lb_type","ws_type"))))))))))))))

LANDFORM 是一个因素,但我也尝试将其更改为字符,但代码仍然不起作用。

“ws_type”是其余变量的全部内容。

代码运行没有错误,但是当我检查它时,我得到的只是:

> unique(b2$LANDFORM)

[1] 不适用“af_type”

我是否走在正确的道路上?有什么建议么?我应该硬着头皮用 substr() 创建一个新列吗?提前致谢。

【问题讨论】:

  • 所以本质上你想重新调整列,听起来像?列应该在更改后保留为一个因素吗?看看?levels 特别是levels<- 替换功能
  • 天哪。也看看%in%
  • @RichardScriven,关卡看起来很有希望。你有什么例子吗?我在 R 手册中检查了该命令,但示例非常简单......

标签: r if-statement


【解决方案1】:

如果您的新关卡只是旧关卡的前两个字母,后跟_type,您可以通过以下方式轻松实现您想要的:

     #prototype of your column
     mycol<-factor(sample(c("aflb","afub","afwb","afws","bfrlb","bfrwb","bfrws","lb","lbwb","lbws","wslb","wsub"), replace=TRUE, size=100))
     as.factor(paste(sep="",substr(mycol,1,2),"_type"))

【讨论】:

  • 唯一的问题是我不能对“ws_type”变量这样做,因为它结合了所有剩余的变量,包括那些不以“ws”开头的变量。 ws-type 应该是“wb”、“wblb”、“wbub”、“wbws”、“ws”和“wslb”的全称。这就是为什么我认为“ifelse”语句会起作用的原因,因为它忽略了字母,只是将剩余的变量强制为“ws_type”
  • 如果只是这个问题,你可以按照我的建议尝试mycol[mycol=="wb_type"]&lt;-"ws_type"
  • 我完全按照您显示的方式运行了代码,除了我将“mycol”更改为“b2$LANDFORM”并且 size=228 以匹配我的数据结构。 b2$LANDFORM=因子(样本(c("af","aflb","afub","afwb","afws","bfrlb","bfrwb","bfrws","bfr","bfr", "bfrwbws","lb","lbaf","lbub","lbwb","wslb","ws"),replace=TRUE,size=228)) as.factor(paste(sep="",substr (b2$LANDFORM,1,2),"_type")) 但是当我使用 head() 命令检查它时,新的 LANDFORM 变量与它们的“旧”变量不匹配。他们甚至不带“_type”后缀,并且没有一致性。 “lb”变成了“lbwb”、“afwb”、“af”、“aflb”等等
  • 另外,很抱歉没有包含代码块。 Ctrl + k 没用,4个空格也没用...
  • 最后一行的结果你赋值了吗?我没有将它包含在 asnwer 中(我认为这很明显),但您需要 b2$LANDFORM&lt;-as.factor(paste(sep="",substr(b2$LANDFORM,1,2),"_type") 才能实际进行更改。如果您仍有问题,请编辑问题。
【解决方案2】:

经过大量试验后,我咨询了一位同事,他能够简化很多。基本上,我应该在 LANDFORM 中创建一个由变量的前两个字母组成的新列,然后从该新列中采样并替换 LANDFORM 中的值,以使 ifelse() 语句更短。代码是:

> b2$index=as.factor(substring(b2$LANDFORM,1,2))

b2$LANDFORM=ifelse(b2$index=="af","af_type",
ifelse(b2$index=="bf","bf_type",
ifelse(b2$index=="lb","lb_type",
ifelse(b2$index=="wb","wb_type",
ifelse(b2$index=="ws","ws_type","ub_type"))))))

b2$LANDFORM=as.factor(b2$LANDFORM)

感谢所有给予我指导的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多