【问题标题】:Manipulating a data frame with contents from a different data frame similar to a SQL join使用来自不同数据帧的内容来操作数据帧,类似于 SQL 连接
【发布时间】:2011-01-15 13:01:21
【问题描述】:

假设我有一个包含内容的数据框:

Trial Person Time
1     John   1.2
2     John   1.3
3     John   1.1
1     Bill   2.3
2     Bill   2.5
3     Bill   2.7

和另一个包含内容的数据框:

Person Offset
John   0.5
Bill   1.0

我想根据第二个的适当值修改原始帧。我可以用任何其他语言或 SQL 轻松地做到这一点,而且我确信我可以使用 for 循环和什么来管理,但是对于我在 R 中看到的所有其他内容,我猜它有特殊的语法可以做到这一点-衬垫。那么,如果是这样,怎么办?如果没有,您能否展示如何使用循环来完成。我实际上还没有开始学习 R 中的循环,因为它可以简单地提取和操作任何值。

作为参考,输出将:

Trial Person Time
1     John   0.7
2     John   0.8
3     John   0.6
1     Bill   1.3
2     Bill   1.5
3     Bill   1.7 

【问题讨论】:

  • 你可以使用更具体的标题..
  • @dallilogm 随意提出建议......我在十分钟内得到了我需要的答案
  • 是的,但是因为标题太笼统了,人们看它只是为了更好地理解它是什么。所以你已经把注意力从其他可能写得更好的问题上转移了,这是不公平的。一个好的标题应该是这样的,这样人们就可以通过阅读它来了解你将要问什么。反正,和平,你没做过太糟糕的事,没关系。
  • 如果您有更好的描述方式,我会更改标题...我只是不知道如何以完美解释的方式描述我的问题。
  • 看看这个 SO question stackoverflow.com/questions/1299871/… 了解如何使用合并。

标签: r dataframe


【解决方案1】:

有很多可能性。这是一个使用merge() 的简单方法,并在放大的data.frame 中进行了简单的列减法:

R> DF1 <- data.frame(trial=rep(1:3,2), \
                     Person=rep(c("John","Bill"), each=3), \
                     Time=c(1.2,1.3,1.1,2.3,2.5,2.7))
R> DF2 <- data.frame(Person=c("John","Bill"), Offset=c(0.5,1.0))
R> DF <- merge(DF1, DF2)
R> DF
  Person trial Time Offset
1   Bill     1  2.3    1.0
2   Bill     2  2.5    1.0
3   Bill     3  2.7    1.0
4   John     1  1.2    0.5
5   John     2  1.3    0.5
6   John     3  1.1    0.5
R> DF$NewTime <- DF$Time - DF$Offset
R> DF
  Person trial Time Offset NewTime
1   Bill     1  2.3    1.0     1.3
2   Bill     2  2.5    1.0     1.5
3   Bill     3  2.7    1.0     1.7
4   John     1  1.2    0.5     0.7
5   John     2  1.3    0.5     0.8
6   John     3  1.1    0.5     0.6
R> 

【讨论】:

  • 哈!我刚刚想出了一个使用 for 循环的单线,但这更漂亮。我没有意识到你可以合并两个框架,它会根据列名找出它们的去向。
【解决方案2】:

一个班轮:

transform(merge(d1,d2), Time=Time - Offset, Offset=NULL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多