我有一个数据集,其中一列由0和1组成。有没有办法将该列分成两列,使其中一列由0组成,另一列由1组成?我尝试使用tidyverse的独立功能,但是还没有成功。
lqfhib0f1#
可以使用gsub两次:
gsub
library(dplyr) df %>% mutate(zeros = gsub("1", "", int), ones = gsub("0", "", int)) # int zeros ones #1 011001010 00000 1111 #2 1001001110 00000 11111 #3 10101011000 000000 11111
或者与strrep + str_count一起使用:
strrep
str_count
library(stringr) df %>% mutate(zeros = strrep("0", str_count(int, "0")), ones = strrep("1", str_count(int, "1")))
数据:
df <- data.frame(int = c("011001010", "1001001110", "10101011000")) # int #1 011001010 #2 1001001110 #3 10101011000
6rqinv9w2#
我们可以在base R中使用split
base R
split
lst1 <- split(df1$col1, df1$col1) mx <- max(lengths(lst1)) data.frame(lapply(lst1, `length<-`, mx))
或者如果我们想创建两列
library(dplyr) library(tidyr) library(data.table) df1 %>% mutate(rn = rowid(col1), colnm = case_when(col1 == 0 ~ "col1", TRUE ~ "col2")) %>% pivot_wider(names_from = colnm, values_from = col1) %>% select(-rn)
# A tibble: 8 × 2 col1 col2 <dbl> <dbl> 1 0 1 2 0 1 3 0 1 4 0 1 5 0 1 6 0 1 7 0 1 8 0 NA
df1 <- structure(list(col1 = c(0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)), class = "data.frame", row.names = c(NA, -15L))
6rqinv9w3#
一个简单的ifelse语句也可以用来做这件事。
df <- as.data.frame(c(0,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0)) names(df)<-"col1" df$col_0 <- ifelse(df$col1 == 0, 0, NA) df$col_1 <- ifelse(df$col1 == 1, 1, NA)
返回以下结果:
> df col1 col_0 col_1 1 0 0 NA 2 0 0 NA 3 1 NA 1 4 0 0 NA 5 1 NA 1 6 1 NA 1 7 0 0 NA 8 0 0 NA 9 0 0 NA 10 0 0 NA 11 0 0 NA 12 1 NA 1 13 0 0 NA 14 0 0 NA 15 0 0 NA 16 0 0 NA 17 1 NA 1 18 1 NA 1 19 0 0 NA
3条答案
按热度按时间lqfhib0f1#
可以使用
gsub
两次:或者与
strrep
+str_count
一起使用:数据:
6rqinv9w2#
我们可以在
base R
中使用split
或者如果我们想创建两列
数据
6rqinv9w3#
一个简单的ifelse语句也可以用来做这件事。
返回以下结果: