我想知道是否有一种简单的方法可以减去奇数行甚至偶数行。基本上是:第一行(A1)减去第二行(A2),第三行(A3)减去第四行(A4)。

test <- structure(list(Well_positions = c("A1", "A2", "A3", "A4", "A5",
"A6", "A7", "A8", "A9", "A10", "A11", "A12"), Layout = c("SM1_1",
"BA1", "SM1_2", "BB1", "SM1_3", "BC1", "SM1_4", "BD1", "SM1_5",
"BE1", "ST1_1", "BF1"), Abs_18 = c(0.20585, 0.16226, 0.1695,
0.11268, 0.16271, 0.11269, 0.23633, 0.18636, 0.22289, 0.18856,
0.11974, 0.059685), FL_18 = c(3669, 51, 3578, 52, 3594, 51, 5378,
55, 5104, 54, 825, 58)), .Names = c("Well_positions", "Layout",
"Abs_18", "FL_18"), row.names = c(NA, -12L), class = c("tbl_df",
"tbl", "data.frame"))

到目前为止,我只有一个主意来创建两个单独的数据帧:
library(dplyr)

data_s <- filter(test, grepl("S", Layout))
data_b <-filter(test, grepl("B", Layout))

然后,我想保留data_s中的“Well_positions”和“Layout”,并获取其余各列(data_s[,3:4] - data_b[,3:4])的区别。但是我不知道如何保留前两列...我可以做的是从data_b中添加两列,然后执行减法运算,但是当我有更多列时,它会变得非常混乱。

最佳答案

使用dplyr的解决方案。

library(dplyr)
test2 <- test %>%
  group_by(grp = (row_number() - 1) %/% 2) %>%
  summarise_all(funs(ifelse(is.numeric(.), first(.) - last(.), first(.)))) %>%
  ungroup() %>%
  select(-grp)
test2
# A tibble: 6 x 4
  Well_positions Layout   Abs_18 FL_18
           <chr>  <chr>    <dbl> <dbl>
1             A1  SM1_1 0.043590  3618
2             A3  SM1_2 0.056820  3526
3             A5  SM1_3 0.050020  3543
4             A7  SM1_4 0.049970  5323
5             A9  SM1_5 0.034330  5050
6            A11  ST1_1 0.060055   767

关于r - 行减法(A1-A2,A3-A4等),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46648753/

10-12 19:43