【问题标题】:Selecting different numbers of columns on each row of a data frame在数据框的每一行上选择不同数量的列
【发布时间】:2015-12-14 14:17:59
【问题描述】:

这个问题是关于在数据框的每一行上选择不同数量的列。我有一个数据框:

df = data.frame(
    START=sample(1:2, 10, repace=T), END=sample(2:4, 10, replace=T),
    X1=rnorm(10), X2=rnorm(10), X3=rnorm(10), X4=rnorm(10)
)

我希望有一种不使用循环的方法来为我的数据框的所有行选择第 i 行上的列 (START[i]:END[i])+2。

【问题讨论】:

  • 你想做什么?即,您将使用选定的列做什么?例如,您想要这些列的值的总和吗?还有什么?
  • 这样的? apply(df, 1, function(x)df[,seq(x[1]+2, x[2]+2)])
  • 目标是将列表的第 i 个元素添加到第 i 行的每个选定单元格中。
  • 理想情况下,我想得到一个 10 行乘 6 列的矩阵,每个单元格为 T 或 F。

标签: r dataframe


【解决方案1】:

基础 R 解决方案

lapply(split(df,1:nrow(df)),function(row) row[(row$START+2):(row$END+2)])

或者类似于上面评论中给出的东西(我会将输出存储在一个列表中)

library(plyr)
alply(df,1,function(row) row[(row$START+2):(row$END+2)])

根据 OP 的请求进行编辑:

要获得 TRUE/FALSE 索引矩阵,请使用以下 R 基础解决方案

idx_matrix=col(df)>=df$START+2&col(df)<=df$END+2
df[idx_matrix]

但是请注意,您会在此处丢失一些信息(与基于列表的解决方案相比)。

【讨论】:

  • 为了更清楚,请选择数组位置。理想情况下,在某种真假数组中。我的目标是将列表的第 i 个元素添加到第 i 行中的每个选定元素。
  • 我已经编辑了上面的答案。这为您提供了一个 TRUE/FALSE 索引矩阵。
  • 这很好用,谢谢!所以事实证明我真的在问函数 col 和 row!很高兴知道
  • 不客气(因为您似乎是 Stackoverflow 的新手:您可以通过选中向上/向下投票箭头下方的勾号来接受答案)
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多