在R:Error中正确使用传播

时间:2017-11-14 22:48:53

标签: r dataframe dplyr tidyr

我有一个数据框inputData,其列为acc_id,attrName,attrValue和timeStamp。 acc_id列将具有重复的条目,因为数据的示例头部将是这样的:

acc_id, attr_name, attr_value, timeStamp
123      abcVar1    138         Nov 1 2017
123      abcVar2    10          Nov 1 2017
123      abcVar3    2124        Nov 1 2017
468      abcVar1    13         Nov 9 2017
468      abcVar2    13458         Nov 9 2017
468      abcVar3    1238         Nov 9 2017

这种情况可以概括为attr_name也不仅仅包含3个唯一变量。

需要将其转换为格式

acc_id abcVar1 abcVar2 abcVar3 timeStamp
123     138      10      2124  Nov 1 2017
468     13       13458   1238  Nov 9 2017

我尝试传播(inputData,attr_name,attr_val)来获取错误

1 个答案:

答案 0 :(得分:2)

基于上面的例子,我得到了这个:

library(tidyr)

df = read.table(text = "
acc_id attr_name attr_value timeStamp
123      abcVar1    138         Nov_1_2017
123      abcVar2    10          Nov_1_2017
123      abcVar3    2124        Nov_1_2017
468      abcVar1    13          Nov_9_2017
468      abcVar2    13458       Nov_9_2017
468      abcVar3    1238        Nov_9_2017
", header=T, stringsAsFactors=F)

spread(df, attr_name, attr_value)

#   acc_id  timeStamp abcVar1 abcVar2 abcVar3
# 1    123 Nov_1_2017     138      10    2124
# 2    468 Nov_9_2017      13   13458    1238

也许您的示例数据框不能代表您的实际数据集。 我不能复制你的问题。

但是,如果存在重复的行,它似乎会中断:

library(tidyr)
library(dplyr)

df = read.table(text = "
acc_id attr_name attr_value timeStamp
123      abcVar1    138         Nov_1_2017
123      abcVar2    10          Nov_1_2017
123      abcVar3    2124        Nov_1_2017
468      abcVar1    13          Nov_9_2017
468      abcVar1    13          Nov_9_2017
468      abcVar2    13458       Nov_9_2017
468      abcVar3    1238        Nov_9_2017
", header=T, stringsAsFactors=F)

spread(df, attr_name, attr_value)

# Error: Duplicate identifiers for rows (4, 5)

# deduplicate and reshape
df %>%
  distinct() %>%
  spread(attr_name, attr_value)

#   acc_id  timeStamp abcVar1 abcVar2 abcVar3
# 1    123 Nov_1_2017     138      10    2124
# 2    468 Nov_9_2017      13   13458    1238