r - 如何将多个变量复制到列
问题描述
我想将几个变量复制到列中。我目前有这样的数据。
date bundle_name totbund prod1 totprod1 prod2 totprod2
06/01/2019 a_bund 1 a 1 b 1
06/01/2019 a 1
06/01/2019 b 2
07/01/2019 b_bund 1 b 2
07/01/2019 b_bund 2 b 4
07/01/2019 b 2
变成这样
date bundle_name totbund prod1 totprod1 prod2 totprod2
06/01/2019 a_bund 1 a 1 b 1
06/01/2019 a 1 a 1
06/01/2019 b 2 b 2
07/01/2019 b_bund 1 b 2
07/01/2019 b_bund 2 b 4
07/01/2019 b 2 b 2
因此,如果该行的 prod1 和 totprod1 列为空,我想将 bundle_name 中的数据复制到 prod1 并将 totbund 中的数据复制到 totprod1 。有没有办法做到这一点?提前非常感谢
解决方案
直接使用ifelse
:
x$prod1 <- ifelse(is.na(x$prod1) | !nzchar(x$prod1), x$bundle_name, x$prod1)
x$totprod1 <- ifelse(is.na(x$totprod1) | !nzchar(x$totprod1), x$totbund, x$totprod1)
x
# date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1 06/01/2019 a_bund 1 a 1 b 1
# 2 06/01/2019 a 1 a 1 NA
# 3 06/01/2019 b 2 b 2 NA
# 4 07/01/2019 b_bund 1 b 2 NA
# 5 07/01/2019 b_bund 2 b 4 NA
# 6 07/01/2019 b 2 b 2 NA
由于您提到了管道(不确定您的意思):
dplyr
library(dplyr)
x %>%
mutate(
prod1 = if_else(is.na(prod1) | !nzchar(prod1), bundle_name, prod1),
totprod1 = if_else(is.na(totprod1) | !nzchar(totprod1), totbund, totprod1)
)
# date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1 06/01/2019 a_bund 1 a 1 b 1
# 2 06/01/2019 a 1 a 1 NA
# 3 06/01/2019 b 2 b 2 NA
# 4 07/01/2019 b_bund 1 b 2 NA
# 5 07/01/2019 b_bund 2 b 4 NA
# 6 07/01/2019 b 2 b 2 NA
data.table
library(data.table)
library(magrittr)
xDT <- x
setDT(xDT)
xDT %>%
.[, totprod1 := ifelse(is.na(totprod1) | !nzchar(totprod1), totbund, totprod1) ] %>%
.[, prod1 := ifelse(is.na(prod1) | !nzchar(prod1), bundle_name, prod1) ] %>%
.[]
# date bundle_name totbund prod1 totprod1 prod2 totprod2
# 1: 06/01/2019 a_bund 1 a 1 b 1
# 2: 06/01/2019 a 1 a 1 NA
# 3: 06/01/2019 b 2 b 2 NA
# 4: 07/01/2019 b_bund 1 b 2 NA
# 5: 07/01/2019 b_bund 2 b 4 NA
# 6: 07/01/2019 b 2 b 2 NA
(尾随%>% .[]
只是为了让它在控制台上打印,在生产中是不必要的。)
样本数据。我添加了空字符串""
以尝试模仿您在问题中的内容,但我不确定它是否看起来那样,因为您实际上有空字符串(并且所有数字都是真正的字符串),或者您是否只是手动输入让它看起来不错。s 是由 R 推断出来的NA
,因为第一行数据中有数字,空字符串在那里没有意义。
x <- read.table(header = TRUE, stringsAsFactors = FALSE, text='
date bundle_name totbund prod1 totprod1 prod2 totprod2
06/01/2019 a_bund 1 a 1 b 1
06/01/2019 a 1 "" "" "" ""
06/01/2019 b 2 "" "" "" ""
07/01/2019 b_bund 1 b 2 "" ""
07/01/2019 b_bund 2 b 4 "" ""
07/01/2019 b 2 "" "" "" ""')
推荐阅读
- c# - 使用 .net core 将存储过程的结果与返回对象映射
- terraform - 在 Azure Pipeline 上使用 Terraform 删除或添加 Azure SQL 的资源锁需要什么权限
- gradle - 我想创建一个 aab 文件
- sql - radius 服务器,mac 地址过滤器
- android - 验证 XML 给出错误:外部资源 http://schemas.android.com/apk/res/android 未注册
- database - 我应该如何为 Mongo 示例公司数据库使用 $graphLookup
- python-3.x - 正则表达式匹配以连字符结尾或开头的单词
- c++ - 从命令行编译时 C++ 运行缓慢
- java - 在 Spring Tool Suite 上运行旧项目
- string - 使用 Java 11 出现“无法找到方法 makeConcatWithConstants”