具有未知名称的单独列
2018-11-23
1054
我有一个这样的数据框:
structure(list(header = 1:10, ST.adk.fumC.gyrB.icd.mdh.purA.recA = c(" 10 10 11 4 8 8 8 2",
" 48 6 11 4 8 8 8 2", " 58 6 4 4 16 24 8 14", " 88* 6* 4 12 1 20 12 7",
" 117 20 45 41 43 5 32 2", " 7036 526 7 1 1 8 71 6", " 101 43 41 15 18 11 7 6",
" 3595 112 11 5 12 8 88 86", " 117 20 45 41 43 5 32 2", " 744 10 11 135 8 8 8 2"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
我想要做的是将第二列拆分为单独的列,用列名中的“。”分隔。但是,并不总是知道列的名称是什么,这就是为什么我无法在 dplyr 的“separate”函数中使用该列的名称。
我尝试了以下操作:
library(dplyr)
library(stringr)
library(tidyr)
# get new column names
ids <- unlist(strsplit(names(df)[-1],
split = ".",
fixed = TRUE))
# get name of column to split
split_column <- names(df)[-1]
df %>%
separate(split_column, into = ids, extra = "merge")
这在我使用的脚本文件中有效,但当我获取脚本时,我收到以下错误:
Error: `var` must evaluate to a single number or a column name, not a character vector
为什么当我在 RStudio 中像往常一样运行它时,它有效,但当我获取脚本时它会抛出此错误? 此外,这是否是将未知名称的列实际拆分为具有未知名称的新列的最佳方法?
我在另一个脚本文件中使用以下代码来获取脚本:
system(paste("Rscript script.R", opt$m, opt$o))
其中 opt$m 和 opt$o 是目录路径。这适用于我拥有的类似脚本,但使用上述脚本会引发错误。
我希望有某种类似 split_at 的函数,但目前尚不存在。.
2个回答
您可以使用
strsplit()
。
split <- do.call(rbind, strsplit(gsub("\\*", "", df[, -1]), " "))[, -1]
df1 <- data.frame(df[, 1], split)
df1[] <- lapply(df1, function(x) as.numeric(as.character(x)))
names(df1) <- unlist(strsplit(names(df), split = ".", fixed=TRUE))
> df1
header ST adk fumC gyrB icd mdh purA recA
1 1 10 10 11 4 8 8 8 2
2 2 48 6 11 4 8 8 8 2
3 3 58 6 4 4 16 24 8 14
4 4 88 6 4 12 1 20 12 7
5 5 117 20 45 41 43 5 32 2
6 6 7036 526 7 1 1 8 71 6
7 7 101 43 41 15 18 11 7 6
8 8 3595 112 11 5 12 8 88 86
9 9 117 20 45 41 43 5 32 2
10 10 744 10 11 135 8 8 8 2
数据
df <-structure(list(header = 1:10, ST.adk.fumC.gyrB.icd.mdh.purA.recA = c(" 10 10 11 4 8 8 8 2",
" 48 6 11 4 8 8 8 2", " 58 6 4 4 16 24 8 14", " 88* 6* 4 12 1 20 12 7",
" 117 20 45 41 43 5 32 2", " 7036 526 7 1 1 8 71 6", " 101 43 41 15 18 11 7 6",
" 3595 112 11 5 12 8 88 86", " 117 20 45 41 43 5 32 2", " 744 10 11 135 8 8 8 2"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
jay.sf
2018-11-24
解决方案与您的示例基本相同,但有一些调整。我会这样做,假设您想删除列中的
'*'
:
library(tidyverse)
library(hablar)
# Vector of new column names
ids <- simplify(strsplit(names(df)[-1],
split = ".",
fixed = T))
# Seperate second column
df %>%
mutate_at(2, funs(trimws(gsub("\\*", "", .)))) %>%
separate(2, into = ids, extra = "merge", sep = " ") %>%
retype()
为您提供:
# A tibble: 10 x 9
header ST adk fumC gyrB icd mdh purA recA
<int> <int> <int> <int> <int> <int> <int> <int> <int>
1 1 10 10 11 4 8 8 8 2
2 2 48 6 11 4 8 8 8 2
3 3 58 6 4 4 16 24 8 14
4 4 88 6 4 12 1 20 12 7
5 5 117 20 45 41 43 5 32 2
6 6 7036 526 7 1 1 8 71 6
7 7 101 43 41 15 18 11 7 6
8 8 3595 112 11 5 12 8 88 86
9 9 117 20 45 41 43 5 32 2
10 10 744 10 11 135 8 8 8 2
davsjob
2018-11-24