R语言 如何分隔整数列?

qcbq4gxm  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(172)

我有一个数据集,其中一列由0和1组成。有没有办法将该列分成两列,使其中一列由0组成,另一列由1组成?
我尝试使用tidyverse的独立功能,但是还没有成功。

lqfhib0f

lqfhib0f1#

可以使用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一起使用:

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
6rqinv9w

6rqinv9w2#

我们可以在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))
6rqinv9w

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

相关问题