R bind_rows 在使用 %>% 时表现不一致
R bind_rows not behaving consistently when using %>%
我有以下小标题
tst <- tibble(
x = 'actual data',
age_1 = 5.3,
age_2 = 6.6,
age_3 = 8.3,
age_4 = 20.3,
age_5 = 25.3,
age_6 = 30.8,
age_7 = 31.3,
age_8 = 22.3,
age_9 = 18.3,
age_10 = 14.3
)
我可以用
创建新的第一行四舍五入值行
demo <- tst %>%
c(x='round',round(.[nrow(.),2:(ncol(.))])) %>%
bind_rows(tst,.)
demo
# A tibble: 2 x 11
x age_1 age_2 age_3 age_4 age_5 age_6 age_7 age_8 age_9 age_10
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 actual data 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
2 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
现在,当我尝试使用相同的代码创建另一行底值时,出现错误
demo %>%
c(x='floor',round(demo[1,2:(ncol(demo))])) %>%
bind_rows(demo,.)
Error in bind_rows_(x, .id) : Argument 12 must be length 2, not 1
但是,如果我以更圆的方式做我认为相同的事情,它会起作用
i <- c(x='floor',round(demo[1,2:(ncol(demo))]))
bind_rows(demo,i)
# A tibble: 3 x 11
x age_1 age_2 age_3 age_4 age_5 age_6 age_7 age_8 age_9 age_10
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 actual data 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
2 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
3 floor 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
我不知道为什么当 运行 与我创建圆角行时的代码基本相同时会出现该错误。有任何想法吗?如果您有更好的建议(根据上面的行添加行),我很乐意听取他们的意见。
在 R 中处理宽数据集可能非常违反直觉。以长格式处理数据几乎总是更可取。直到您可能想要以宽 table 显示的程度。
我会像这样重塑您的数据:
library(tidyr)
library(dplyr)
tst <- tibble(
x = 'actual data',
age_1 = 5.3,
age_2 = 6.6,
age_3 = 8.3,
age_4 = 20.3,
age_5 = 25.3,
age_6 = 30.8,
age_7 = 31.3,
age_8 = 22.3,
age_9 = 18.3,
age_10 = 14.3
)
df <- tst %>%
select(-x) %>%
gather(var, actual) %>%
mutate(
var = "age",
round = round(actual),
floor = floor(actual)
)
df
# # A tibble: 10 x 4
# var actual round floor
# <chr> <dbl> <dbl> <dbl>
# 1 age 5.30 5.00 5.00
# 2 age 6.60 7.00 6.00
# 3 age 8.30 8.00 8.00
# 4 age 20.3 20.0 20.0
# 5 age 25.3 25.0 25.0
# 6 age 30.8 31.0 30.0
# 7 age 31.3 31.0 31.0
# 8 age 22.3 22.0 22.0
# 9 age 18.3 18.0 18.0
# 10 age 14.3 14.0 14.0
您现在可以看到添加 round
和 floor
是多么容易。要从控制台以宽格式快速显示,您可以将其转换为原始问题的表示形式。
df %>% select(-var) %>% t
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# actual 5.3 6.6 8.3 20.3 25.3 30.8 31.3 22.3 18.3 14.3
# round 5.0 7.0 8.0 20.0 25.0 31.0 31.0 22.0 18.0 14.0
# floor 5.0 6.0 8.0 20.0 25.0 30.0 31.0 22.0 18.0 14.0
一种 tidy
方法,而不是快速查看可能是:
df %>%
mutate(cols = paste(var, sprintf("%02d", seq_len(nrow(.))), sep = "_")) %>%
gather(var, value, -cols) %>%
filter(var != "var") %>%
spread(cols, value) %>%
mutate_at(vars(2:length(.)), as.numeric)
# # A tibble: 3 x 11
# var age_01 age_02 age_03 age_04 age_05 age_06 age_07 age_08 age_09 age_10
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 actual 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
# 2 floor 5.00 6.00 8.00 20.0 25.0 30.0 31.0 22.0 18.0 14.0
# 3 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
N.B. In this variant, I added the mutate_at
because the numeric values were coerced to character by the gather
of mixed types.
我有以下小标题
tst <- tibble(
x = 'actual data',
age_1 = 5.3,
age_2 = 6.6,
age_3 = 8.3,
age_4 = 20.3,
age_5 = 25.3,
age_6 = 30.8,
age_7 = 31.3,
age_8 = 22.3,
age_9 = 18.3,
age_10 = 14.3
)
我可以用
创建新的第一行四舍五入值行demo <- tst %>%
c(x='round',round(.[nrow(.),2:(ncol(.))])) %>%
bind_rows(tst,.)
demo
# A tibble: 2 x 11
x age_1 age_2 age_3 age_4 age_5 age_6 age_7 age_8 age_9 age_10
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 actual data 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
2 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
现在,当我尝试使用相同的代码创建另一行底值时,出现错误
demo %>%
c(x='floor',round(demo[1,2:(ncol(demo))])) %>%
bind_rows(demo,.)
Error in bind_rows_(x, .id) : Argument 12 must be length 2, not 1
但是,如果我以更圆的方式做我认为相同的事情,它会起作用
i <- c(x='floor',round(demo[1,2:(ncol(demo))]))
bind_rows(demo,i)
# A tibble: 3 x 11
x age_1 age_2 age_3 age_4 age_5 age_6 age_7 age_8 age_9 age_10
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 actual data 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
2 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
3 floor 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
我不知道为什么当 运行 与我创建圆角行时的代码基本相同时会出现该错误。有任何想法吗?如果您有更好的建议(根据上面的行添加行),我很乐意听取他们的意见。
在 R 中处理宽数据集可能非常违反直觉。以长格式处理数据几乎总是更可取。直到您可能想要以宽 table 显示的程度。
我会像这样重塑您的数据:
library(tidyr)
library(dplyr)
tst <- tibble(
x = 'actual data',
age_1 = 5.3,
age_2 = 6.6,
age_3 = 8.3,
age_4 = 20.3,
age_5 = 25.3,
age_6 = 30.8,
age_7 = 31.3,
age_8 = 22.3,
age_9 = 18.3,
age_10 = 14.3
)
df <- tst %>%
select(-x) %>%
gather(var, actual) %>%
mutate(
var = "age",
round = round(actual),
floor = floor(actual)
)
df
# # A tibble: 10 x 4
# var actual round floor
# <chr> <dbl> <dbl> <dbl>
# 1 age 5.30 5.00 5.00
# 2 age 6.60 7.00 6.00
# 3 age 8.30 8.00 8.00
# 4 age 20.3 20.0 20.0
# 5 age 25.3 25.0 25.0
# 6 age 30.8 31.0 30.0
# 7 age 31.3 31.0 31.0
# 8 age 22.3 22.0 22.0
# 9 age 18.3 18.0 18.0
# 10 age 14.3 14.0 14.0
您现在可以看到添加 round
和 floor
是多么容易。要从控制台以宽格式快速显示,您可以将其转换为原始问题的表示形式。
df %>% select(-var) %>% t
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# actual 5.3 6.6 8.3 20.3 25.3 30.8 31.3 22.3 18.3 14.3
# round 5.0 7.0 8.0 20.0 25.0 31.0 31.0 22.0 18.0 14.0
# floor 5.0 6.0 8.0 20.0 25.0 30.0 31.0 22.0 18.0 14.0
一种 tidy
方法,而不是快速查看可能是:
df %>%
mutate(cols = paste(var, sprintf("%02d", seq_len(nrow(.))), sep = "_")) %>%
gather(var, value, -cols) %>%
filter(var != "var") %>%
spread(cols, value) %>%
mutate_at(vars(2:length(.)), as.numeric)
# # A tibble: 3 x 11
# var age_01 age_02 age_03 age_04 age_05 age_06 age_07 age_08 age_09 age_10
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 actual 5.30 6.60 8.30 20.3 25.3 30.8 31.3 22.3 18.3 14.3
# 2 floor 5.00 6.00 8.00 20.0 25.0 30.0 31.0 22.0 18.0 14.0
# 3 round 5.00 7.00 8.00 20.0 25.0 31.0 31.0 22.0 18.0 14.0
N.B. In this variant, I added the
mutate_at
because the numeric values were coerced to character by thegather
of mixed types.