我有一个数据框和两个名为left
和right
的整数向量。
我想创建一个数据框的子集,使得向量中的数字将指示要包含在子集中的列的范围。
例如,对于数据框中的第n行,我想保留这些值
df[n,left[n]:right[n]
。
我尝试使用mapply()
:
aligned_rows<-apply(df,1,
function(x) mapply(function(y,z)x[y:z], left, right))
但得到的输出没有任何意义。
答案 0 :(得分:2)
这个命令可以解决问题:
as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
x=seq_len(nrow(df)),y=left,z=right)))
以下是一个例子:
set.seed(10)
df <- data.frame(replicate(8,runif(4)))
# X1 X2 X3 X4 X5 X6 X7 X8
# 0.51 0.09 0.62 0.11 0.05 0.86 0.41 0.77
# 0.31 0.23 0.43 0.60 0.26 0.62 0.71 0.36
# 0.43 0.28 0.65 0.36 0.40 0.78 0.84 0.54
# 0.69 0.27 0.57 0.43 0.84 0.36 0.24 0.09
申请
left <- c(1,3,5,7)
right <- c(2,4,6,8)
as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
x=seq_len(nrow(df)),y=left,z=right)))
产量
# X1 X2
# 0.51 0.09
# 0.43 0.60
# 0.40 0.78
# 0.24 0.09
为了实现这一点,left
和right
定义的每个范围必须包含相同数量的元素。此外,left
和right
必须包含与df
中的行一样多的元素。
答案 1 :(得分:0)
如上所述问题尚不清楚,希望下面的例子会给出一些提示:
#dummy data
df <- data.frame(matrix(runif(20,1,50),nrow=4))
#right left dummy
right <- c(1,3,4)
left <- c(5,4,5)
#nth value, also try n <- c(2,4) to get 2nd and 4th rows
n <- 2
#return list of data.frames
lapply(1:length(right),
function(x) df[n,right[x]:left[x]])
答案 2 :(得分:0)
如果没有更多信息,您的问题是不适合的,因为无法保证每行中您想要的项目数量是相同的。请记住,数据框是一个矩形对象,即所有行必须具有相同的长度。
获得更合理的是列表,它没有此限制:
mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE)
假设每行产生相同数量的项目,您可以将它们与rbind
结合使用:
do.call(rbind, mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE))
还有其他问题,例如,您可能将来自不同列的项目组合在一起,如果它们具有不同的类,那将是无意义的。但你没有提到这个问题,所以我假设你的数据框架更像是一种矩阵,这种操作更为明智。