【问题标题】:Writing a while loop for two sets of data for R为R的两组数据编写一个while循环
【发布时间】:2018-09-09 06:21:51
【问题描述】:

这可能很简单,但我是 R 新手,它不像 Grad 那样工作,所以我一直在寻找高低的例子,但无济于事..

我有两组数据。数据 A (1997) 和数据 B (2000)
数据 A 有 35 个标题(苹果、橙子、葡萄等)。 200 次观察。
数据 B 有 35 个标题(苹果、橙子、葡萄等)。 200 次观察。

这两个数据集的唯一区别是年份。

所以我想关联两个数据集,即 Apples (1997) 下的 200 个数据与 Apples (2000) 下的 200 个数据。所以 1 个标题应该只给我 1 个值。

我已将所有标题名称转换为 V1、V2、V3...

所以现在我需要这样做:

x<-1

while(x<35) { 

   new(x)=cor(1997$V(x),2000$V(x))

   print(new(x))

}

然后我得到这个错误:

pptn26$V(x) 中的错误:尝试应用非函数。

非常感谢任何建议!

【问题讨论】:

  • 你的代码没有意义;你有一个以x 为条件的while 循环,但x 永远不会改变。 new 是一个函数吗?它在哪里定义? 1997$V(x) 不是有效的 R 代码。你想做什么?

标签: r dataframe while-loop


【解决方案1】:

您的错误直接来自使用 R 不期望它们的括号。如果您执行1(x),您将得到相同类型的错误。 1 不是一个函数,所以如果你把它放在括号旁边,中间没有空格,你就是在尝试应用一个非函数。

在遇到其他几个错误之前,您是如何设法解决该错误的,我也有点惊讶,但我想这与 R 评估什么有关...

以下是获取所需行为的方法:

mapply(cor, A, B)
# provided A is the name of your 1997 data frame and B the 2000

这是一个模拟数据的例子:

set.seed(123)
A <- data.frame(x = 1:10, y = sample(10), z = rnorm(10))
B <- data.frame(x = 4:13, y = sample(10), z = rnorm(10))
mapply(cor, A, B)
#         x          y          z 
# 1.0000000  0.1393939 -0.2402058 

在其典型用法中,mapply 接受一个 n 元函数和 n 个为该函数提供 n 个参数的对象。这里的n元函数是cor,对象是AB,每个都是一个数据帧。数据框被构造为向量列表,即数据框的列。因此,mapply 将为您循环遍历您的列,对 cor 进行 35 次调用,每次调用 AB 的下一列。

如果您已经设法弄清楚如何将数据框命名为 19972000,那就太感谢了。要做到这一点并不容易。它也会让你头疼。您需要为您的数据框提供一个语法上有效的名称。这意味着它们应该以字母(或点,但实际上是字母)开头。详情请见the R FAQ

【讨论】:

  • 非常感谢!是的,我想出了如何更改名称。这比写while循环简单得多
  • @MT32 不客气 :) 如果这回答了您的问题,请选择它作为答案(带有复选标记)。一旦您获得投票的声誉,您还可以投票回答您的问题:stackoverflow.com/help/someone-answers
  • @MT32 我希望你理解我的观点,你不应该将你的数据框(或任何对象)命名为 1997。这是可能的,但你不应该这样做。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2019-07-30
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多