为一列中的值重塑数据

Posted

技术标签:

【中文标题】为一列中的值重塑数据【英文标题】:Reshape data for values in one column 【发布时间】:2011-12-26 23:43:07 【问题描述】:

我的 data.frame 看起来像这样

ID | test | test_result
1  |  B   |   10
2  |  A   |   9
3  |  A   |   11
4  |  C   |   7
5  |  F   |   5

我想得到这样的东西:

test | test_reult_ID1 | test_result_ID2 | test_result_ID3 ...
 A   |   NA           |     9           |   11
 B   |   10           |     NA          |   NA

它仅在少数情况下使用 reshape() 到宽格式,但对于整个数据框(大约 23.000 个 ID),reshape() 需要太长时间。 Melt() 和 cast() 确实重塑了数据,但将 test_result 中的值替换为测试的频率。任何其他想法如何管理这个?谢谢!

【问题讨论】:

***.com/a/9617424/210673 现在列出了执行此操作的各种方法。 【参考方案1】:

来自 reshape2 包的 dcast 这样做:

require(reshape2)
dcast(data, test ~ ID , value_var = 'test_result' )

#  test  1  2  3  4  5
#1    A NA  9 11 NA NA
#2    B 10 NA NA NA NA
#3    C NA NA NA  7 NA
#4    F NA NA NA NA  5

【讨论】:

我刚刚用整个 data.frame 进行了尝试,它给了我这个错误消息:Aggregation function missing: defaulting to length 并且再次只有频率而不是值。但是只有几行在工作中。你知道为什么吗? @Elisa 当您的dcast 参数在结果的每个单元格中产生多个值时,就会发生这种情况。如果发生这种情况,则需要进行某种聚合,默认函数是计数。您的数据中是否有重复值?无论如何,也许可以尝试mean 作为聚合函数。 @Andrie:聚合函数会停止错误,但显然mean 不起作用,因为:argument is not numeric or logical: returning NA 是否有像“只返回值”这样的聚合函数? 你的问题是要返回的值不止一个,所以你需要找到一个函数,将多个值折叠成一个值。如果您的数据属于character 类,或许可以考虑使用paste 解决了这个问题:问题是一个 ID 出于某种原因有三行而不是两行。然后,duplicated() 解决了这个问题。【参考方案2】:

base R 中使用reshape 函数的另一种解决方案。

reshape(mydf, direction = 'wide', idvar = 'test', timevar = 'ID', 
  v.names = 'test_result', sep = "_")

编辑。我看到您已经尝试过reshape,但时间太长了。您能否提供有关您的实际数据的更多详细信息?

【讨论】:

我的原始数据有这三列和大约 23000 行。每两行都有相同的 ID(一个人解决了两个测试,例如 A 和 F,因此有两个结果和两行)。这可能是问题所在?

以上是关于为一列中的值重塑数据的主要内容,如果未能解决你的问题,请参考以下文章

将列中的数据合并为一列

如何获取表中的所有数据,如果在一列中重复相同的值,该行应该计数一次?

如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

基于另一列中的值的一列上的pyspark滞后函数

根据其他列中的条件更新一列中的值