如何解决使用 spread() 或 pivot_wider() 获取重复/非唯一错误/警告消息的具有 2 列宽格式的 R 数据框
这显然是一个入门级问题,但似乎表明我可能遗漏了 R 如何在基本级别上处理数据转置的一些基础知识......
注意,我一直在阅读所有其他消息/回复,但我仍然对为什么我无法执行下面这个非常简单的任务感到困惑。
有人至少可以向我解释这里发生了什么,以及如何在警告消息中使用这些选项? (在 3 列或更多列的正常情况下相当简单,所以这里缺少一些东西..)
我的目的是首先创建一个 2 列的数据集,每个 fn 变量有 100 条记录和 10 个级别,然后将其转置为一个包含 10 列的宽数据集。
fn <- seq(1,10)
val <- rnorm(100,1)
datout <- data.frame(fn,val)
##no duplicate
> which(duplicated(datout))
integer(0)
##pivot_wider gave me a listing with warning message:
datwd <- datout %>%
mutate(fn=paste0("type",fn)) %>%
pivot_wider(names_from=fn,values_from=val)
##只获取带有警告消息的列表:
一点点:1 x 10
type1 type2 type3 type4 type5 type6 type7 type8 type9 type10
1
- 使用
values_fn = list
取消此警告。 - 使用
values_fn = length
来确定重复的 ari**se - 使用
values_fn = {summary_fun}
汇总重复项
##spread() won't work at all
> datout %>%
+ spread("fn","val")
Error: Each row of output must be identified by a unique combination of keys.
解决方法
你快到了。您的错误消息说:Values are not uniquely identified
。如果您查看 pivot_wider
的示例,您会发现您需要一个唯一标识符列来帮助将值引导到正确的位置。
datout %>%
dplyr::mutate(
# Create an ID col
ID = rep(1:10,times = 10) %>% sort,fn=paste0("type",fn)) %>%
tidyr::pivot_wider(
# Use ID col here
id_cols = ID,names_from=fn,values_from=val)
输出:
# A tibble: 10 x 11
ID type1 type2 type3 type4 type5 type6 type7 type8 type9 type10
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0.805 -1.81 -0.235 -0.986 1.05 -2.11 0.951 1.24 0.401 0.517
2 2 -1.33 -0.433 0.939 0.263 0.412 1.58 0.864 0.223 0.541 0.530
3 3 -0.785 0.0519 -0.581 0.527 0.0339 0.440 0.980 -1.75 -0.346 2.49
4 4 0.279 0.261 -1.21 -0.232 -1.00 -0.455 1.22 -0.434 0.262 -2.36
5 5 -0.559 0.684 -1.56 0.747 -0.195 -3.22 0.383 0.735 -1.30 0.539
6 6 0.618 0.544 -2.45 0.936 0.0550 1.49 1.83 -1.19 0.257 0.875
7 7 0.308 -1.94 -0.440 -0.855 -0.712 0.475 0.418 0.718 1.60 -1.44
8 8 0.877 1.60 1.34 1.90 0.381 -0.440 -0.266 -0.0980 1.82 0.538
9 9 1.38 0.199 -0.165 -1.09 0.350 0.966 -1.58 -0.888 0.551 0.493
10 10 0.143 -0.476 0.118 -1.16 -1.57 -1.73 0.479 -0.401 -0.932 -0.469
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。