[英]Tidying same ordered data placed in different rows across different columns
我进行了批量导入,导致 df 以不整洁的方式结束。 问题出在原始数据库上,为此我无能为力。
在导入和 rotate_df 之后,我最终得到了这个
x y z
1 NA NA
2 NA NA
NA 1 NA
NA 2 NA
NA NA 1
NA NA 2
基本上,相反,一个新文件的数据被堆叠添加,每个附加列的数据(旋转后)仅从前一列的 +34 行开始。
鉴于我无法使用更改原始数据库,是否有任何绝地技巧可以将我当前的 df 更改为此?
x y z
1 1 1
2 2 2
由于每个列都具有相同的信息,因此可以使我的 df 整洁。
谢谢你。
你可以试试
as.data.frame(lapply(df, na.omit))
# x y z
# 1 1 1 1
# 2 2 2 2
更新:删除NA
后,似乎所有变量的长度都不相同。 以以下数据为例:
x y z
1 NA NA
2 NA NA
NA 1 NA
NA 2 NA
NA NA 1
NA NA 2
NA NA 3
它的预期 output 是什么? 保持3
喜欢
# x y z
# 1 1 1
# 2 2 2
# NA AN 3
或丢弃它
# x y z
# 1 1 1
# 2 2 2
或使用其他规则?
另一种可能的解决方案,基于purrr::map_dfc
:
library(purrr)
map_dfc(df, na.omit)
#> # A tibble: 2 × 3
#> x y z
#> <int> <int> <int>
#> 1 1 1 1
#> 2 2 2 2
如果您遇到矢量不匹配错误,则表明您的一些“正确”值也是 NA。 这些可能是您的数据库中的 NULL,或者由于类型不匹配而被 R 转换为 NA 的值:确保您知道它发生了什么并且您没有在导入中丢失数据。
也就是说,这意味着您可能想要使用您拥有的另一条信息 - 列以可重现的距离交错。
df <-
structure(list(x = c(1L, 2L, NA, NA, NA, NA), y = c(NA, NA, 1L,
2L, NA, NA), z = c(NA, NA, NA, NA, 1L, 2L)), row.names = c(1L,
2L, 3L, 4L, 5L, 6L), class = "data.frame")
stagger <- 2 # this would be 34 in your real data
df_compact <- as.data.frame(lapply(1:ncol(df), function(i)
df[((i-1)*stagger+1) : (i*stagger), i]
))
colnames(df_compact) <- colnames(df)
df_compact
x y z
1 1 1 1
2 2 2 2
这只有在nrow(df) = stagger * ncol(df)
时才能正常工作。 如果没有,您将不会收到错误,而是会收到各种可怕的推算NA
,所以要非常小心,然后找到其他方法来验证您的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.