r - 将数据框列解压缩为多列
问题描述
我正在尝试创建一个函数,如果它存在,它将改变一个列。如果该列确实存在,我将返回一个包含两列的数据框。我想帮助将此数据框列解压缩到其组件列中:
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
my_transformation = function(df){
df %>%
mutate(across(any_of('cyl'), function(x) tibble(a = x + 3, b = x + 1)))
}
df_1 = as_tibble(mtcars)
df_2 = df_1 %>% select(-cyl)
my_transformation(df_1)
#> # A tibble: 32 x 11
#> mpg cyl$a $b disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 9 7 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 9 7 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 7 5 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 9 7 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 11 9 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 9 7 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 11 9 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 7 5 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 7 5 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 9 7 168. 123 3.92 3.44 18.3 1 0 4 4
#> # … with 22 more rows
my_transformation(df_2)
#> # A tibble: 32 x 10
#> mpg disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 168. 123 3.92 3.44 18.3 1 0 4 4
#> # … with 22 more rows
由reprex 包(v0.3.0)于 2020 年 8 月 22 日创建
如您所见,在调用 时my_transformation(df_1)
,有两个子列:cyl$a
和cyl$b
。如何让这些成为常规列?
我试过unnest(cyl)
但没有成功。
解决方案
因此,我发现删除数据框列的“嵌套”的唯一方法是不提供 LHS 参数,mutate
如此处所述
不幸的是,across
无法用于检查缺失的列,因为它用于.names
在 LHS 上分配某些内容。
因此,我采取的方法是在缺失列的情况下插入缺失的列,然后mutate
在没有across
.
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tibble)
my_transformation = function(df){
cols <- c(cyl = NA_real_)
df %>%
add_column(!!!cols[!names(cols) %in% names(.)]) %>%
mutate(tibble(a = cyl + 3, b = cyl + 1))
}
df_1 = as_tibble(mtcars)
df_2 = df_1 %>% select(-cyl)
my_transformation(df_1)
#> # A tibble: 32 x 13
#> mpg cyl disp hp drat wt qsec vs am gear carb a b
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 9 7
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 9 7
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 7 5
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 9 7
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 11 9
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 9 7
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 11 9
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 7 5
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 7 5
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 9 7
#> # … with 22 more rows
my_transformation(df_2)
#> # A tibble: 32 x 13
#> mpg disp hp drat wt qsec vs am gear carb cyl a b
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 160 110 3.9 2.62 16.5 0 1 4 4 NA NA NA
#> 2 21 160 110 3.9 2.88 17.0 0 1 4 4 NA NA NA
#> 3 22.8 108 93 3.85 2.32 18.6 1 1 4 1 NA NA NA
#> 4 21.4 258 110 3.08 3.22 19.4 1 0 3 1 NA NA NA
#> 5 18.7 360 175 3.15 3.44 17.0 0 0 3 2 NA NA NA
#> 6 18.1 225 105 2.76 3.46 20.2 1 0 3 1 NA NA NA
#> 7 14.3 360 245 3.21 3.57 15.8 0 0 3 4 NA NA NA
#> 8 24.4 147. 62 3.69 3.19 20 1 0 4 2 NA NA NA
#> 9 22.8 141. 95 3.92 3.15 22.9 1 0 4 2 NA NA NA
#> 10 19.2 168. 123 3.92 3.44 18.3 1 0 4 4 NA NA NA
#> # … with 22 more rows
由reprex 包于 2020-08-23 创建(v0.3.0)
不是该解决方案的忠实拥护者。但它确实有效。我正在考虑为要返回输出数据框列的实例创建一个 github 问题,mutate
但仅在存在输入列的情况下使用。
推荐阅读
- excel - 是否可以填充与 Excel 中其他单元格中的值一样多的下一个单元格?
- c# - 按列表过滤子集合
- flutter - Flutter - 在对话框窗口中更改 CircularProgressIndicator 的大小
- git - Git不跟踪repo中的现有文件
- isabelle - 伊莎贝尔:验证重言式
- python - 在模板标记 Django Python 中处理媒体图像时出错
- swift - 每当用户状态发生变化时,如何更新 UILabel?
- r - 使用回归模型预测值
- google-bigquery - Bigquery 在文件大小为 8GB 的 GCS 中导出表,即使使用单个通配符 URI 将表导出到小于 1 gb 的文件块中
- python - 在 Visual Studio 中运行 matplotlib-cpp