gpt4 book ai didi

r - 从 tibble (R, dplyr) 中的每一行中减去 1 行

转载 作者:行者123 更新时间:2023-12-01 22:59:03 27 4
gpt4 key购买 nike

这应该很简单……dplyr 中的行向操作

#tibble
a=tibble(a=1:4,b=1:4,c=1:4)

#one row tibble to be subtracted from first one
b=tibble(a=5,b=5,c=5)

#well, this won't work
a-b

Error in Ops.data.frame(a, b) :
‘-’ only defined for equally-sized data frames

当然,解决方法是复制 tibble 的行......但并不优雅

#replicating
c=tibble(a=rep(5,4),b=rep(5,4),c=rep(5,4))

#works
a-c

但这不应该与一些按行操作一起使用吗?

a %>% rowwise %>% mutate(across(everything(), ~.-b))

没有

# A tibble: 4 × 3
# Rowwise:
a b c
<int> <int> <int>
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0

编辑:答案汇编

首先,更清晰地表述问题:

#tibble
a <- tibble(a=1:4,b=1:4,c=1:4)

#one row tibble to be subtracted from first one
b <- tibble(a=5,b=2,c=1)

#objective: turn this into a full-dplyr one-liner
a - b[rep(1,nrow(a)),]

现在,解决方案:

#Gregor's answer below is very clean
a %>% {. - b[rep(1, nrow(.)), ]}

#Full-dplyr is just slightly longer
a %>% {. - slice(b, rep(1,nrow(.)) ) }

#Ronak's answer is most compact
purrr::pmap_dfr(a, ~. - b)

#without the namespace even better:
pmap_dfr(a, ~. - b)

最佳答案

如果您想留在 tidyverse 中,您可以使用 pmap_dfr,这将有助于对多列进行按行操作。

b=tibble(a=5,b=2,c=1)
purrr::pmap_dfr(a, ~. - b)

# a b c
#1 -4 -1 0
#2 -3 0 1
#3 -2 1 2
#4 -1 2 3

在基础 R 中,你可以做

t(t(a) - unlist(b))

# a b c
#[1,] -4 -1 0
#[2,] -3 0 1
#[3,] -2 1 2
#[4,] -1 2 3

请注意,为清楚起见,我更改了 b 的值。

关于r - 从 tibble (R, dplyr) 中的每一行中减去 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72330160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com