R 添加一列,显示前两列是否包含0
我有一个名为R 添加一列,显示前两列是否包含0,r,function,dataframe,loops,lapply,R,Function,Dataframe,Loops,Lapply,我有一个名为dat的data.frame。我想在其中添加一个名为dif的新列。然后,在每一行中,如果lower和upper范围包括0(例如,第一行-0.41到0.1),我希望dif值显示FALSE,否则(例如,0.10到0.2第二行)TRUE 对于任何类似的data.frame,这是否可以在R中实现(以下是一个玩具示例,功能性答案值得赞赏) dat您可以使用dplyr::between: 库(dplyr) dat%>% 行() 变异(dif=!介于(0、更低、更高)之间) 输出 #一个tibl
dat
的data.frame。我想在其中添加一个名为dif
的新列。然后,在每一行中,如果lower
和upper
范围包括0(例如,第一行-0.41
到0.1
),我希望dif
值显示FALSE
,否则(例如,0.10
到0.2
第二行)TRUE
对于任何类似的data.frame,这是否可以在R中实现(以下是一个玩具示例,功能性答案值得赞赏)
dat您可以使用dplyr::between
:
库(dplyr)
dat%>%
行()
变异(dif=!介于(0、更低、更高)之间)
输出
#一个tible:3 x 3
#顺时针:
上下dif
1-0.41 0.1错误
2 0.1 0.2正确
3-0.20.3错误
您可以使用:
transform(dat, dif = lower > 0 | upper < 0)
# lower upper dif
#1 -0.41 0.1 FALSE
#2 0.10 0.2 TRUE
#3 -0.20 0.3 FALSE
transform(dat,dif=lower>0 | upper<0)
#上下dif
#1-0.41 0.1错误
#2 0.10 0.2正确
#3-0.20 0.3假
我们可以从dplyr
library(dplyr)
mutate(dat, dif = lower > 0 | upper < 0)
下面是另一个使用do.call*
dat$dif <- do.call("*", dat) > 0
啊!!有一个问题,我的实际数据有行名,应用您的解决方案会删除行名!这是真的,提迪沃斯。您可以通过使用dat%>%mutate(rn=row.names(.),.before=everything())
启动链来解决这个问题。但是,除非你致力于保持一切井井有条,否则在你的情况下,这是一个不必要的额外步骤。保持船名是至关重要的。我正在进行多重比较,唯一让用户不会对输出感到困惑的是行名。谢谢,不过我会支持你的解决方案。明白了——只是说行名实际上只是另一种列,从这个意义上说,保留它们并不难——特别是对于多重比较而言。数据帧索引没有像Python那样在R中获得特权状态。因此,整个tidyverse框架鼓励将数据移动到列格式,包括行名/索引。但这更像是一种哲学立场,而不是一种实践立场,我认为,@Ronak Shah的解决方案提供了一种简单的保留行名的base R方法,这是一个伟大而更好的解决方案。@Rnoruzian谢谢。我展示了一个Map
方法,以防对不同的列进行多个不同的比较
Reduce(`|`, Map(function(x, y) match.fun(y)(x, 0), dat, c(">", "<")))
#[1] FALSE TRUE FALSE
dat$dif <- do.call("*", dat) > 0
> dat
lower upper dif
a 1 -0.41 0.1 FALSE
a 2 0.10 0.2 TRUE
a 3 -0.20 0.3 FALSE