根据 R 中的两个索引,为每一行获取 data.frame 中的列范围
Get Range of Columns in data.frame for each row, based on two indexes in R
我有一个相当大的 data.frame,有几千行和几十列。有些行在最后一列中有 NA 值。示例 df:
pos1 pos2 pos3 pos4 pos5 pos6
case1 0.5 0.6 0.5 0.3 0.2 NA
case2 0.3 0.7 0.2 0.1 0.5 0.5
case3 0.1 0.2 0.6 0.8 NA NA
case4 0.4 0.1 0.1 0.6 0.3 0.9
.
.
.
此外,我必须索引 i1 和 i2 的向量:
i1:
[1] 2 3 2 1
i2:
[1] 5 4 5 6
我想做的是根据 i1 和 i2 中的索引定义的范围对 data.frame 的每一行进行子集化。说,我想得到一个向量列表或第二个 data.frame,其中每个向量或行都是初始 data.frame 的一行,根据 i1:12 过滤,并可能用NAs 如果输出是 data.frame.
所需的输出将是:
向量列表:
[[1]]
[1] 0.6 0.5 0.3 0.2
[[2]]
[1] 0.2 0.1
[[3]]
[1] 0.2 0.6 0.8 NA
[[4]]
[1] 0.4 0.1 0.1 0.6 0.3 0.9
Data.frame:
pos1 pos2 pos3 pos4 pos5 pos6
case1 NA 0.6 0.5 0.3 0.2 NA
case2 NA NA 0.2 0.1 NA NA
case3 NA 0.2 0.6 0.8 NA NA
case4 0.4 0.1 0.1 0.6 0.3 0.9
.
.
.
如果我只有一个索引并且只想为每一行获取一个值,我知道我可以使用 seq_along 获取以下形式的值向量:
subset <- df[cbind(seq_along(i1),i1)]
但是我无法获得正确的代码来做一些类似的事情,但使用由两个索引分隔的一系列值。
拜托,我需要一些帮助。非常感谢。
我们可以使用Map
Map(function(x, i, j) x[i:j], asplit(df, 1), i1, i2)
-输出
#$case1
#pos2 pos3 pos4 pos5
# 0.6 0.5 0.3 0.2
#$case2
#pos3 pos4
# 0.2 0.1
#$case3
#pos2 pos3 pos4 pos5
# 0.2 0.6 0.8 NA
#$case4
#pos1 pos2 pos3 pos4 pos5 pos6
# 0.4 0.1 0.1 0.6 0.3 0.9
第二种情况
do.call(rbind, Map(function(x, i, j) replace(x, !seq_along(x) %in%
i:j, NA), asplit(df, 1), i1, i2))
-输出
# pos1 pos2 pos3 pos4 pos5 pos6
#case1 NA 0.6 0.5 0.3 0.2 NA
#case2 NA NA 0.2 0.1 NA NA
#case3 NA 0.2 0.6 0.8 NA NA
#case4 0.4 0.1 0.1 0.6 0.3 0.9
数据
df <- structure(list(pos1 = c(0.5, 0.3, 0.1, 0.4), pos2 = c(0.6, 0.7,
0.2, 0.1), pos3 = c(0.5, 0.2, 0.6, 0.1), pos4 = c(0.3, 0.1, 0.8,
0.6), pos5 = c(0.2, 0.5, NA, 0.3), pos6 = c(NA, 0.5, NA, 0.9)),
class = "data.frame", row.names = c("case1",
"case2", "case3", "case4"))
i1 <- c(2, 3, 2, 1)
i2 <- c(5, 4, 5, 6)
我有一个相当大的 data.frame,有几千行和几十列。有些行在最后一列中有 NA 值。示例 df:
pos1 pos2 pos3 pos4 pos5 pos6
case1 0.5 0.6 0.5 0.3 0.2 NA
case2 0.3 0.7 0.2 0.1 0.5 0.5
case3 0.1 0.2 0.6 0.8 NA NA
case4 0.4 0.1 0.1 0.6 0.3 0.9
.
.
.
此外,我必须索引 i1 和 i2 的向量:
i1:
[1] 2 3 2 1
i2:
[1] 5 4 5 6
我想做的是根据 i1 和 i2 中的索引定义的范围对 data.frame 的每一行进行子集化。说,我想得到一个向量列表或第二个 data.frame,其中每个向量或行都是初始 data.frame 的一行,根据 i1:12 过滤,并可能用NAs 如果输出是 data.frame.
所需的输出将是:
向量列表:
[[1]]
[1] 0.6 0.5 0.3 0.2
[[2]]
[1] 0.2 0.1
[[3]]
[1] 0.2 0.6 0.8 NA
[[4]]
[1] 0.4 0.1 0.1 0.6 0.3 0.9
Data.frame:
pos1 pos2 pos3 pos4 pos5 pos6
case1 NA 0.6 0.5 0.3 0.2 NA
case2 NA NA 0.2 0.1 NA NA
case3 NA 0.2 0.6 0.8 NA NA
case4 0.4 0.1 0.1 0.6 0.3 0.9
.
.
.
如果我只有一个索引并且只想为每一行获取一个值,我知道我可以使用 seq_along 获取以下形式的值向量:
subset <- df[cbind(seq_along(i1),i1)]
但是我无法获得正确的代码来做一些类似的事情,但使用由两个索引分隔的一系列值。
拜托,我需要一些帮助。非常感谢。
我们可以使用Map
Map(function(x, i, j) x[i:j], asplit(df, 1), i1, i2)
-输出
#$case1
#pos2 pos3 pos4 pos5
# 0.6 0.5 0.3 0.2
#$case2
#pos3 pos4
# 0.2 0.1
#$case3
#pos2 pos3 pos4 pos5
# 0.2 0.6 0.8 NA
#$case4
#pos1 pos2 pos3 pos4 pos5 pos6
# 0.4 0.1 0.1 0.6 0.3 0.9
第二种情况
do.call(rbind, Map(function(x, i, j) replace(x, !seq_along(x) %in%
i:j, NA), asplit(df, 1), i1, i2))
-输出
# pos1 pos2 pos3 pos4 pos5 pos6
#case1 NA 0.6 0.5 0.3 0.2 NA
#case2 NA NA 0.2 0.1 NA NA
#case3 NA 0.2 0.6 0.8 NA NA
#case4 0.4 0.1 0.1 0.6 0.3 0.9
数据
df <- structure(list(pos1 = c(0.5, 0.3, 0.1, 0.4), pos2 = c(0.6, 0.7,
0.2, 0.1), pos3 = c(0.5, 0.2, 0.6, 0.1), pos4 = c(0.3, 0.1, 0.8,
0.6), pos5 = c(0.2, 0.5, NA, 0.3), pos6 = c(NA, 0.5, NA, 0.9)),
class = "data.frame", row.names = c("case1",
"case2", "case3", "case4"))
i1 <- c(2, 3, 2, 1)
i2 <- c(5, 4, 5, 6)