如果我有一个这样的表:
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
怎么办?
答案 0 :(得分:5)
您可以使用split
和cut
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中的split
和cut
方法,它会给出一个结果列表,并且只想创建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