我有两个数据框,我希望将一个数据框的值插入另一个数据框(让我们称之为DF1
和DF2
)。
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”
我究竟做错了什么?
非常感谢您的光临
答案 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$col1
到DF2$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