[英]Subsetting data frame in R based on range of values in a column
我有一個具有多個列和行的數據框(df),例如:
A B C
0.6 a. b
0.9 c. d
1.1. e. f
1.2 g. h
1.4 I l
1.5. m. n
5.0 o. p
5.3 q. r
5.6. s. t
6.1. u v
6.5. w. z
6.9. y a
7.0. b. c
我正在尋找的代碼應該計算A列中每個連續值之間的差異(0.9-0.3 = 0.3、1.1-0.9 = 0.2,依此類推),如果差異較大,則將某個閾值(此處設置為3)但可以不同)它將在該間隙之前和之后分配一定數量的行(在這種情況下,假設為3,但是也可以有所不同),在這種情況下,差異大於閾值設置。 因此,在這種情況下,將保留5.0-1.5 = 3.5,該值大於3、1.5之前的3行和5.0之后的3行,其余部分將被刪除。 關於如何編寫此類代碼的任何想法?
輸出:
A B C
1.1. e. f
1.2 g. h
1.4 I l
1.5. m. n
5.0 o. p
5.3 q. r
5.6. s. t
6.1. u v
我有多個數據幀,因此A列中的值不同,代碼應逐個查看每個數據幀,並根據閾值設置找出A列中的間隙在哪里。
dput
格式的數據。
輸入:data.frame df1
。
df1 <-
structure(list(A = c(0.6, 0.9, 1.1, 1.2, 1.4,
1.5, 4, 4.3, 4.6, 5.1, 5.5, 5.9, 6),
B = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 12L, 13L, 2L), .Label = c("a.",
"b.", "c.", "e.", "g.", "I", "m.", "o.",
"q.", "s.", "u", "w.", "y"), class = "factor"),
C = structure(c(2L, 4L, 5L, 6L, 7L, 8L, 9L,
10L, 11L, 12L, 13L, 1L, 3L), .Label = c("a",
"b", "c", "d", "f", "h", "l", "n", "p",
"r", "t", "v", "z"), class = "factor")),
row.names = c(NA, -13L), class = "data.frame")
輸出:data.frame out
。
out <-
structure(list(A = c(1.1, 1.2, 1.4, 1.5, 4,
4.3, 4.6, 5.1), B = structure(1:8,
.Label = c("e.", "g.", "I", "m.", "o.",
"q.", "s.", "u"), class = "factor"),
C = structure(1:8, .Label = c("f", "h", "l",
"n", "p", "r", "t", "v"), class = "factor")),
row.names = c(NA, -8L), class = "data.frame")
這是我的df:
structure(list(POS = c(207687374L, 207689227L, 207690871L, 207691563L,
207693563L, 207694165L, 207694357L, 207738077L, 207739127L, 207740272L,
207740868L, 207747296L, 207747984L, 207748107L), SNP = c("rs12130494",
"rs4844601", "rs10863358", "rs77357299", "rs12043913", "rs61822967",
"rs11117991", "rs7515905", "rs3886100", "rs12038575", "rs34883952",
"rs1752684", "rs17046851", "rs10127904"), Std_iHS = c(-1.52176,
-1.51905, -1.50286, 0.656487, -1.45251, 0.84325, -1.06089, -1.41041,
1.29513, 1.21325, 0.456717, -1.00933, -1.71468, 0.265969)), row.names =
21:34, class = "data.frame")
輸出:
structure(list(POS = c(207691563L,
207693563L, 207694165L, 207694357L, 207738077L, 207739127L, 207740272L,
207740868L, ), SNP = c( "rs77357299", "rs12043913", "rs61822967",
"rs11117991", "rs7515905", "rs3886100", "rs12038575", "rs34883952",
), Std_iHS = c( 0.656487, -1.45251, 0.84325, -1.06089, -1.41041,
1.29513, 1.21325, 0.456717, )), row.names = 21:34, class = "data.frame")
使用base R,您可以執行以下操作:
limit = 2
df1[match(unique(c(sapply(which(diff(df1$A)>limit),function(x)(x-3):(x+4)))),1:nrow(df1)),]
A B C
3 1.1 e. f
4 1.2 g. h
5 1.4 I l
6 1.5 m. n
7 4.0 o. p
8 4.3 q. r
9 4.6 s. t
10 5.1 u v
看起來您的示例數據框沒有超過3.0的任何跳轉,但是此代碼應該可以工作:
limit <- 2.0
structure(list(A = c(0.6, 0.9, 1.1, 1.2, 1.4,
1.5, 4, 4.3, 4.6, 5.1, 5.5, 5.9, 6),
B = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 12L, 13L, 2L), .Label = c("a.",
"b.", "c.", "e.", "g.", "I", "m.", "o.",
"q.", "s.", "u", "w.", "y"), class = "factor"),
C = structure(c(2L, 4L, 5L, 6L, 7L, 8L, 9L,
10L, 11L, 12L, 13L, 1L, 3L), .Label = c("a",
"b", "c", "d", "f", "h", "l", "n", "p",
"r", "t", "v", "z"), class = "factor")),
row.names = c(NA, -13L), class = "data.frame") %>%
mutate(diffA = A - lag(A, 1)) %>%
mutate(over_limit = diffA > limit) %>%
mutate(before_limit = lag(over_limit, 1) | lag(over_limit, 2),
after_limit = lead(over_limit, 1) | lead(over_limit, 2)) %>%
rowwise() %>%
mutate(subset_filter = any(over_limit, after_limit, before_limit)) %>%
ungroup() %>%
filter(subset_filter) %>%
select(-c(subset_filter, diffA, over_limit, before_limit, after_limit))
以dput()格式輸出:
structure(list(A = c(1.4, 1.5, 4, 4.3, 4.6),
B = structure(6:10, .Label = c("a.", "b.", "c.", "e.", "g.", "I", "m.", "o.", "q.", "s.", "u", "w.", "y"), class = "factor"),
C = structure(7:11, .Label = c("a", "b", "c", "d", "f", "h", "l", "n", "p", "r", "t", "v", "z"), class = "factor")),
class = c("tbl_df", "tbl", "data.frame"),
row.names = c(NA, -5L), .Names = c("A", "B", "C"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.