如何在R中将表格拆分为一列?

时间:2019-03-15 19:17:21

标签: r split

如果我有一个这样的表:

Sam   55
Toby  30
Fred  45
gdgv  63
Wed   19
Bill  26
....

我想根据值(> 40,(30,40),<30)将此表拆分为几个表,这意味着它们将如下所示:
表1:

Sam  55
Fred 45
gdgv 63

表2:

Toby 30

表3:

Bill  19
Wed   26

没有for loop怎么办?

5 个答案:

答案 0 :(得分:5)

您可以使用splitcut

split(dat,
      cut(dat$V2,
          breaks = c(-Inf, 30, 40, Inf),
          labels = c("<30", "(30,40)", ">40"),
          right = FALSE))
#$`<30`
#    V1 V2
#5  Wed 19
#6 Bill 26

#$`(30,40)`
#    V1 V2
#2 Toby 30

#$`>40`
#    V1 V2
#1  Sam 55
#3 Fred 45
#4 gdgv 63

数据

text <- "Sam   55
Toby  30
Fred  45
gdgv  63
Wed   19
Bill  26"

dat <- read.table(text = text, stringsAsFactors = FALSE, header = FALSE)

答案 1 :(得分:3)

使用dplyr,您可以尝试以下操作:

df %>%
 group_split(grp = ifelse(V2 > 40, 1,
                          ifelse(V2 >= 30 & V2 <= 40, 2, 3)))

[[1]]
# A tibble: 3 x 3
  V1       V2   grp
  <chr> <int> <dbl>
1 Sam      55     1
2 Fred     45     1
3 gdgv     63     1

[[2]]
# A tibble: 1 x 3
  V1       V2   grp
  <chr> <int> <dbl>
1 Toby     30     2

[[3]]
# A tibble: 2 x 3
  V1       V2   grp
  <chr> <int> <dbl>
1 Wed      19     3
2 Bill     26     3

或使用case_when()代替ifelse()的相同想法:

df %>%
 group_split(grp = case_when(V2 > 40 ~ 1,
                             V2 >= 30 & V2 <= 40 ~ 2,
                             TRUE ~ 3))

或使用cut()

df %>%
 group_split(grp = cut(V2,
                       breaks = c(-Inf, 30, 40, Inf),
                       labels = c("<30", "(30,40)", ">40"),
                       right = FALSE)) 

[[1]]
# A tibble: 2 x 3
  V1       V2 grp  
  <chr> <int> <fct>
1 Wed      19 <30  
2 Bill     26 <30  

[[2]]
# A tibble: 1 x 3
  V1       V2 grp    
  <chr> <int> <fct>  
1 Toby     30 (30,40)

[[3]]
# A tibble: 3 x 3
  V1       V2 grp  
  <chr> <int> <fct>
1 Sam      55 >40  
2 Fred     45 >40  
3 gdgv     63 >40 

答案 2 :(得分:0)

使用var ts = TimeSpan.ParseExact(LoadDuration, "hh':'mm':'ss':'fffff", CultureInfo.InvariantCulture); (以下注释中的数据):

plyr

结果:

plyr::llply(split(df2,df2$Number<30),function(x) split(x,x$Number>30))

注意::

$`FALSE`
$`FALSE`$`FALSE`
  Name Number
2 Toby     30

$`FALSE`$`TRUE`
  Name Number
1  Sam     55
3 Fred     45
4 gdgv     63


$`TRUE`
$`TRUE`$`FALSE`
  Name Number
5  Wed     19
6 Bill     26

答案 3 :(得分:0)

如果您不想使用@markus中的splitcut方法,它会给出一个结果列表,并且只想创建3个单独的对象,则只需执行此操作即可。

df<-read.table(text="Name Number
                Sam   55
                Toby  30
                Fred  45
                gdgv  63
                Wed   19
                Bill  26",header=T)
table1 <- df[df$Number>40,]
table2 <- df[df$Number>=30 & df$Number<=40,]
table3 <- df[df$Number<30,]

答案 4 :(得分:0)

borrowing data from @markus :

split(dat, (dat$V2 >= 30) + (dat$V2 > 40))
# $`0`
#     V1 V2
# 5  Wed 19
# 6 Bill 26
# 
# $`1`
#     V1 V2
# 2 Toby 30
# 
# $`2`
#     V1 V2
# 1  Sam 55
# 3 Fred 45
# 4 gdgv 63