r - 使用 tidyr,当传播值得到 NA
问题描述
我有一个问题,我使用 tidyr 尝试转换数据,从长到宽和从宽到长。所有功能作为收集,联合工作正常,但是当我应用传播时,我得到了正确的格式,但很大比例的值变成了 NA。我无法上传这些数据。你对为什么会变成这样以及我能做些什么有想法吗?
解决方案
一个常见的错误(我也犯过)是,在应用该函数时spread
,数据中仍有一列与每个预期的行不同。
一个例子:
数据
df <- data.frame(id = rep(1:5,2),
g = rep(1:2,5),
gname = rep(letters[1:2],5),
x1 = letters[1:10],
x2 = letters[11:20])
代码
df %>%
gather(key,value,-id,-g,-gname) %>%
unite(dummy,key,g) %>%
spread(dummy,value)
结果
# A tibble: 10 x 6
id gname x1_1 x1_2 x2_1 x2_2
<int> <fct> <chr> <chr> <chr> <chr>
1 1 a a NA k NA
2 1 b NA f NA p
3 2 a g NA q NA
4 2 b NA b NA l
5 3 a c NA m NA
6 3 b NA h NA r
7 4 a i NA s NA
8 4 b NA d NA n
9 5 a e NA o NA
10 5 b NA j NA t
因为gname
是在使用传播之前留下的数据,所以出问题了。
所以以下:
df %>%
gather(key,value,-id,-g,-gname) %>%
unite(dummy,key,g) %>%
select(-gname) %>%
spread(dummy,value)
给出正确的结果:
id x1_1 x1_2 x2_1 x2_2
1 1 a f k p
2 2 g b q l
3 3 c h m r
4 4 i d s n
5 5 e j o t
推荐阅读
- java - 如何在命令行上指定密钥库类型?
- php - 如何从具有多个输入的动态添加的行中存储数据
- linux - 将数组名称传递给bash中的函数
- python-3.x - 带有自定义 bin 的 TensorFlow 直方图
- c# - MemoryStream 是否在施工时复制?
- java - Selenium Web 驱动程序 - 如何处理 href 链接中的动态
- javascript - 谷歌地图 - 获取英国县的坐标
- intel - SGX 本地证明样本在模拟器中返回 0x3002
- javascript - 用 2 个属性过滤 javascript 中的数组
- sql - 计算 48 小时内出现的时间记录数 - SQL