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的东西来改变一下!我不担心这个:这里似乎有很多数据表!