R 表中的If/else语句

R 表中的If/else语句,r,if-statement,R,If Statement,比方说,我有一个名为table的表,其标题如下 ab 12 21 我想做的是添加一个新列表$C,这样 如果table$A

比方说,我有一个名为
table
的表,其标题如下

ab

12

21

我想做的是添加一个新列
表$C
,这样

  • 如果
    table$A
    那么
    table$C table$B
    那么
    table$C table$C table$C使用逻辑索引:

    table$C <- (table$B-table$A)/((table$A<=table$B)*table$A+(table$A>table$B)*table$B)
    
    table$C正如您所指出的,您的第二种方法(没有最初的打字错误)是正确的,但我认为这更快、更容易阅读,并且不容易出错:

    table$C <- with(table, ifelse(A < B, (B - A)/A, (B - A)/B))
    
    table$C像往常一样,有很多方法可以实现这一点。假设你的规则保持不变,你永远不会有被零除的情况,这里有一些想法

    df <- data.frame(A = c(1, 2), B = c(2, 1))
    
    # Making use of pmin.
    df$c <- (df$B - df$A) / pmin(df$A, df$B)
    
    # Making use of 'with' ( See ?with )
    df$C <- with(df, (B - A)/pmin(A, B))
    
    # Making use of data.table.
    library(data.table, quiet = TRUE)
    
    ## data.table 1.8.2 For help type: help("data.table")
    
    dt <- data.table(df)
    
    dt[, `:=`(C, (B - A)/pmin(A, B))]
    
    ##    A B  C
    ## 1: 1 2  1
    ## 2: 2 1 -1
    

    df最后一张
    表格$B前面是否有反斜杠?我删除了反斜杠。这只是使用太多乳胶的一个坏习惯。:-)第一个调用分配了两次C,这可能是个坏主意。第二个解决方案在我看来还行。好吧,正如亚历克斯所说,第二个方案是正确的。这个问题原来只是一个简单的打字错误-(RSK的回答也很有帮助,因为我一直沉迷于if/else语句,这让我想到了‘开箱即用’。谢谢各位!我以为我以前看到了一个带有
    答案的
    ,我本来会这样做的。它被删除了吗?+1我最近注意到人们使用函数
    :=
    (),但我想知道为什么。
    dt[,C:=(B-A)/min(A,B)
    稍微容易一点吗?
    min
    s需要是
    pmin
    s吗?@MatthewDowle我在试着训练我的思维使用“`:=”(``多变量使用的格式::)是的,min应该是pmin谢谢!但是
    ':='()
    不需要多变量是吗?
    DT[,c(“new1”,“new2”):=1,with=FALSE]
    添加两个新列,
    DT[,字母:=2,with=FALSE]
    添加26(除非已经存在任何
    字母,在这种情况下,这些列会被更新)。顺便说一句,在第一种情况下,需要
    with=FALSE
    删除FR(LHS是一个
    调用
    ),但在第二种情况下总是需要
    with=FALSE
    (也就是说该列不应被称为
    “字母”
    )。好吧,你觉得怎么样。我不知道我从何而来的想法,我不能做
    dt[,c('a','b'):=list(rev(a),rev(b)),with=FALSE]
    但它确实有效。呜呜!这会在一行中重复变量
    9次。看看变量名称重复是如何起作用的。
    可能更好。你的意思是这样的:
    表哦,很好。
    实际上没有多大帮助。在效率方面,
    $C是的。顺便说一句,我不是建议使用data.table。我只是解释了为什么我对
    中的
    的建议结果很差(也就是说,因为我对它不太熟悉)。我只是想建议一些不是data.table的东西来改变一下!我不担心这个:这里似乎有很多数据表!