【问题标题】:in R return position of values in a data frame在R中返回值在数据框中的位置
【发布时间】:2015-02-02 16:47:08
【问题描述】:

我有一个包含五列数据的数据框,我想找到 1 到 20 之间的数字所在的位置(例如) 对于我使用过的单个实例(我在堆栈溢出中发现的东西)

Filter( function(data) length(data)>1, split(data$No., data$N1))$`1`

首先,我尝试让函数在指定的 N1 列中查找 1:20。 我试过了:

    data.occurence = NULL

for (i in min(data$N1):max(data$N1) ) {
    i = i
    data.occurence[i] = Filter( function(data) length(data)>1, split(data$No., data$N1))$`i`
    data.occurence[i]   
    }

这没有给我任何东西。我知道“for”部分“有效”——我希望在 i = 1:20 时获得 data.occurence[1] 以及值所在位置的 ID,依此类推。 我还希望该函数能够遍历五列中的每一列,每次都重复相同的搜索 示例数据:

      No.        dat N1 N2 N3 N4 N5 N6 BN
1    1994 2015-01-31  7 10 16 33 39 44 15
2    1993 2015-01-28  3  4 17 24 30 34 36
3    1992 2015-01-24  4  8 19 35 44 49 17
4    1991 2015-01-21  1  6 32 34 37 45 26
5    1990 2015-01-17 29 37 42 46 47 49  4
6    1989 2015-01-14 17 20 28 29 33 36 23
7    1988 2015-01-10 13 14 16 24 41 43 39
8    1987 2015-01-07  4  5 10 12 20 23 24

运行:

Filter( function(data) length(data)>1, split(data$No., data$N1))$`4`

给出 N1 列中包含 4 的行 id 的结果:

[1] 1992 1987 1977 1961 1960 1957

【问题讨论】:

  • 请展示一些示例数据和预期输出
  • 如果你给一个对象赋值为NULL,你就是在擦除它。

标签: r for-loop


【解决方案1】:

你可以试试

 lst <- lapply(paste0('N', 1:6), function(x)
        Filter(function(data) length(data)>1, split(data$No., data[x])))

更新

假设您想减去“No”的“最大值”。来自“lst”元素

 mx <- max(data$No.)
 lapply(lst, function(x) mx-unlist(x))

或者

 lapply(lst, function(x) lapply(x, function(.x) mx-.x))

【讨论】:

  • 阿克伦。如果我想从 max(data$No.) 中减去你的 lapply 给出的值,即“之前有多少观察”而不是 ID,我该怎么做?我尝试将 -max(data$No.) 放在 apply 中,但收到错误“二进制运算符的非数字参数”。
  • 和以前一样,完美。我需要仔细考虑这一切实际上是如何运作的。在概念上对我来说相当困难。
  • @user1478335 看看str(lst)。你会发现它是一个嵌套列表。 lapply( 将进入列表的第一层。但是,要进入嵌套的,您必须取消列出或使用另一个lapply。我认为如果您创建一个嵌套嵌套的嵌套列表然后尝试,这将变得更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多