R使用for()循环将一个数据帧填充到另一个数据帧

时间:2011-06-02 19:49:12

标签: r for-loop

我有两个数据框,我希望将一个数据框的值插入另一个数据框(让我们称之为DF1DF2)。

DF1由2列1和2组成。第1列(col1)包含字符a到z,col2包含与每个字符相关的值(从a到z)

DF2是一个包含3列的数据框。前两个由DF1$col1的所有组合组成:aa ab ac ad etc;第一个字母在col1,第二个字母在col2

我想利用DF1$col2中的值创建一个简单的数学模型,以查看DF1$col1中每个可能的对象组合的结果 我想要做的第一步是将值从DF1$col2转移到DF2$col3(来自DF2$col3的值应该与DF2col1中的值相关联),但这就是我被卡住的地方。我目前有

for(j in 1:length(DF2$col1))
{
  ## this part is to use the characters in DF2$col1 as an input 
  ## to yield the output for DF2$col3--
  input=c(DF2$col1)[j]

  ## This is supposed to use the values found in DF1$col2 to fill in DF2$col3

  g=DF1[(DF1$col2==input),"pred"]

  ## This is so that the values will fill in DF2$col3--
  DF2$col3=g
}

当我运行时,DF2$col3将填充DF1中特定字符的相同值(例如DF2$col3将使所有行都填充与字符关联的值来自DF1的“a” 我究竟做错了什么?

非常感谢您的光临

3 个答案:

答案 0 :(得分:4)

正如@Aaron在上面的评论中所建议的,你应该真正使用merge,但是如果你坚持编写自己的循环,那么在你最后一行中遇到问题,就像你指定{{1}一样}值到整个g列。您还应该使用col3索引,例如:

j

如果这样做不成功,请发布一些示例数据库,以便能够提供更多详细信息(我不知道,但有一点可能是for(j in 1:length(DF2$col1)) { DF2$col3[j] = DF1[(which(DF1$col2 == DF2$col1[j]), "pred"] } )。

答案 1 :(得分:1)

听起来你要做的就是简单的加入,即匹配DF1$col1DF2$col1,并将DF1$col2中的相应值复制到DF2$col3。试试这个:

DF1 <- data.frame(col1=letters, col2=1:26, stringsAsFactors=FALSE)
DF2 <- expand.grid(col1=letters, col2=letters, stringsAsFactors=FALSE)
DF2$col3 <- DF1$col2[match(DF2$col1,  DF1$col1)]

这使用函数match(),正如文档所述,“返回第二个参数中第一个参数(第一个)匹配位置的向量。”您在DF1$col1中拥有的值是唯一的,因此此方法不会出现任何问题。

作为旁注,在R中,通常更好地对工作进行矢量化而不是使用显式循环。

答案 2 :(得分:0)

我不确定我完全理解你的问题,但你可以试试这个:

df1 <- data.frame(col1=letters[1:26], col2=sample(1:100, 26))
df2 <- with(df1, expand.grid(col1=col1, col2=col1))
df2$col3 <- df1$col2  

最后一个命令使用回收(它也可以写为rep(df1$col2, 26))。

结果显示如下:

> head(df1, n=3)
  col1 col2
1    a   68
2    b   73
3    c   45
> tail(df1, n=3)
   col1 col2
24    x   22
25    y    4
26    z   17
> head(df2, n=3)
  col1 col2 col3
1    a    a   68
2    b    a   73
3    c    a   45
> tail(df2, n=3)
    col1 col2 col3
674    x    z   22
675    y    z    4
676    z    z   17