[英]Splitting several columns of a dataframe with 'separate' (tidyr) in R
大家早上好,我已经阅读了几个关于用R分割列的事情,但我找不到如何解决我的情况。
我想根据一个分隔符,使用tidyr R包中的'separate'函数将每个数据帧的列分成两列。
我有这个数据框:
dat1 AIN5997 AIN7452 AIN8674 AIN9655 001 01/02 02/02 02/02 01/02 002 01/02 01/01 02/02 02/02 003 01/02 01/02 01/01 02/02 004 01/02 01/01 02/02 01/02 005 01/01 01/01 02/02 02/02 006 01/02 01/02 01/01 02/02 ...
我想根据“/”将每列分成两列,如果可能的话,保留列名称(例如:AIN5997将成为AIN5997.1和AIN5997.2)
我认为可以使用'separate'但是当我尝试使用'apply'时,我无法将过程扩展到我的帧的每一列(可能因为单独使用数据帧和一次一列)。 这一定非常容易,但我的R技能非常糟糕!
有许多线程解释如何将一列拆分为两列,如下所示: 将数据帧的列拆分为多列
但我找不到如何同时扩展几个列的过程。
非常感谢您的帮助,
祝一切顺利 :)
诀窍是以正确的顺序创建新名称,因此请确保预先订购要分隔的列。
NA
值的问题在于进程无法拆分它们。 所以,诀窍是用你可以拆分的东西替换它们。 检查一下:
library(dplyr)
library(tidyr)
# example dataset
dt = data.frame(id = 1:2,
AIN5997 = c("01/02", "01/02"),
AIN7452 = c("02/02", NA),
AIN8674 = c("02/02","02/02"), stringsAsFactors = F)
# specify columns you want to separate (specify column positions)
input_names = names(dt)[2:4]
# create new names (you want each name twice)
new_names = expand.grid(input_names, 1:2) %>%
unite(v, Var1, Var2, sep=".") %>%
pull(v) %>%
sort()
dt %>%
unite_("v", input_names) %>% # unite columns of interest
mutate(v = gsub("NA", "NA/NA", v)) %>% # replace NAs with something that can be separated
separate(v, new_names, convert = F) # separate elements and give new names
# id AIN5997.1 AIN5997.2 AIN7452.1 AIN7452.2 AIN8674.1 AIN8674.2
# 1 1 01 02 02 02 02 02
# 2 2 01 02 NA NA 02 02
我也在添加更好的解决方案。 它会自动处理NA
值,您不必担心列名称及其顺序。
library(dplyr)
library(tidyr)
library(purrr)
# example dataset
dt = data.frame(id = 1:2,
AIN5997 = c("01/02", "01/02"),
AIN7452 = c("02/02", NA),
AIN8674 = c("02/02","02/02"), stringsAsFactors = F)
# separate a given column of your initial dataset
f = function(x) { dt %>% select_("id", x) %>% separate_(x, paste0(x, c(".1",".2"))) }
names(dt)[2:4] %>% # get names of columns you want to separate
map(f) %>% # apply the function above to each name (will create a list of dataframes)
reduce(left_join, by="id") # join dataframes iteratively
# id AIN5997.1 AIN5997.2 AIN7452.1 AIN7452.2 AIN8674.1 AIN8674.2
# 1 1 01 02 02 02 02 02
# 2 2 01 02 <NA> <NA> 02 02
您也可以使用tstrsplit()
。
# example dataset
df <- data.frame(AIN5997 = c("01/02", "01/02"),
AIN7452 = c("02/02","01/01"),
AIN8674 = c("02/02","02/02"), stringsAsFactors = F)
df
df2 <- as.data.frame(unlist(lapply(df, data.table::tstrsplit, "/"),
recursive = FALSE))
df2
colnames(df2) # change colnames
colnames(df2) <- paste(substr(colnames(df2), 1, nchar(colnames(df2))-1),
substr(colnames(df2), nchar(colnames(df2)), nchar(colnames(df2))),
sep = ".")
df2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.