为什么spread()创建仅NA的列?

时间:2018-08-28 01:11:04

标签: r tidyr spread

我仍然是R的初学者,所以我希望这个问题不是多余的,但是我无法找到令人满意的答案。尽管this Question似乎非常相似,但我仍然想知道我的观察是否代表标准情况。当我尝试在包含NA的一列中分布三个唯一观察值时,使用函数tidyr::spread会导致尴尬的行为。结果是一个带有三个新列的小标题(如预期的那样),但还有一个名为“ NA”的附加第四列,其中完全填充了NA。

这是我的示例数据框:

test <- data.frame("Country" = c("A", "A", "A", "A", "A", "A", "A", "A"), 
                   "Column1" = c(1, 1, 1, 1, 1, 1, 2, 2), 
                   "Column2" = c(3, 3, 3, 4, 4, 4, 5, 5), 
                   "Column3" = c("B", "M", "F", "B", "M", "F", "B", NA), 
                   "Column4" = c(50, 74, 31, 53, 79, 33, 51, NA))

test1 <- spread(test, key = "Column3", value = "Column4")

test1

当我的小标题包含缺失值时,这是正常现象吗?如果是这样,为什么?对于标准行为,创建完全填充缺失值的附加列对我来说很奇怪。还是我缺少明显的东西(可能)?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

传播的行为符合预期,尽管NA作为列名和数据帧中的值的重复出现可能使行为不清楚。让我们更改数据框以使用“ Column4”中的虚拟值999

test <- data.frame("Country" = c("A", "A", "A", "A", "A", "A", "A", "A"), "Column1" = c(1, 1, 1, 1, 1, 1, 2, 2), "Column2" = c(3, 3, 3, 4, 4, 4, 5, 5), "Column3" = c("B", "M", "F", "B", "M", "F", "B", 'NA'), "Column4" = c(50, 74, 31, 53, 79, 33, 51, 999))

  Country Column1 Column2 Column3 Column4
1       A       1       3       B      50
2       A       1       3       M      74
3       A       1       3       F      31
4       A       1       4       B      53
5       A       1       4       M      79
6       A       1       4       F      33
7       A       2       5       B      51
8       A       2       5      NA     999

现在是传播操作:

test1 <- spread(test, key = "Column3", value = "Column4")

  Country Column1 Column2  B  F  M  NA
1       A       1       3 50 31 74  NA
2       A       1       4 53 33 79  NA
3       A       2       5 51 NA NA 999

传播已将999值正确放置在新的“ NA”列中(同样,新的列名称取自“ Column3”中的旧值),并将该值与匹配原始数据帧中的值。由于999在原始数据帧中仅出现一次,因此在新数据帧中只有1个匹配行,因此,新的“ NA”列中的所有其他行都用NA填充(再次,这里有些令人困惑)。