如何向仅修改某些列的数据框添加一行
How to add a row to a dataframe modifying only some columns
为了准备绘图数据,我需要向数据添加一个新行:
我有这个数据框:
df <- data.frame(
test_id = c(1, 1, 1, 1),
test_nr = c(1, 1, 1, 1),
region = c("A", "B", "C", "D"),
test_value = c(3, 1, 1, 2)
)
test_id test_nr region test_value
1 1 1 A 3
2 1 1 B 1
3 1 1 C 1
4 1 1 D 2
我想向该数据框添加一行,因此所需的输出应该是:
test_id test_nr region test_value
1 1 1 A 3.00
2 1 1 B 1.00
3 1 1 C 1.00
4 1 1 D 2.00
5 1 1 mean 1.75
如您所见:第 1 列和第 2 列是相同的值,第 3 列更改为 'mean',第 4 列是第 1-4 行的平均值。
我已经尝试使用tibble
包中的add_row
,但出现错误:
library(dpylr)
library(tibble)
df %>%
mutate(mean1 = mean(test_value)) %>%
add_row(test_id = test_id[1], test_nr=test_nr[1],region="mean", test_value=mean(test_value))
Error in eval_tidy(xs[[j]], mask) : object 'test_id' not found
你可以
library(dplyr)
df %>%
add_row(test_id = .$test_id[1], test_nr = .$test_nr[1], region = "mean", test_value = mean(.$test_value))
#> test_id test_nr region test_value
#> 1 1 1 A 3.00
#> 2 1 1 B 1.00
#> 3 1 1 C 1.00
#> 4 1 1 D 2.00
#> 5 1 1 mean 1.75
采用基础 R 方法,您可以构建现有行,然后 rbind
行绑定两个对象。
# save a new vector from any row you like
row_to_add <- df[1,]
# alter the values want one at a time
row_to_add$region <- "mean"
row_to_add$test_value <- mean(df$test_value)
# OR alter them at once if you prefer...
row_to_add[,c("region","test_value")] <- c("mean",mean(df$test_value))
# finally use rbind to add to the bottom of the data.frame
rbind(df,row_to_add)
如果我们想在不调用 .$
的情况下使用 OP 的方法,请使用 magrittr
中的 exposition pipe
(%$%
)。这与使用 with
(来自 base R
)
有相似之处
library(magrittr)
library(dplyr)
df %$%
add_row(., test_id = first(test_id), test_nr = first(test_nr),
region = "mean", test_value = mean(test_value))
test_id test_nr region test_value
1 1 1 A 3.00
2 1 1 B 1.00
3 1 1 C 1.00
4 1 1 D 2.00
5 1 1 mean 1.75
为了准备绘图数据,我需要向数据添加一个新行:
我有这个数据框:
df <- data.frame(
test_id = c(1, 1, 1, 1),
test_nr = c(1, 1, 1, 1),
region = c("A", "B", "C", "D"),
test_value = c(3, 1, 1, 2)
)
test_id test_nr region test_value
1 1 1 A 3
2 1 1 B 1
3 1 1 C 1
4 1 1 D 2
我想向该数据框添加一行,因此所需的输出应该是:
test_id test_nr region test_value
1 1 1 A 3.00
2 1 1 B 1.00
3 1 1 C 1.00
4 1 1 D 2.00
5 1 1 mean 1.75
如您所见:第 1 列和第 2 列是相同的值,第 3 列更改为 'mean',第 4 列是第 1-4 行的平均值。
我已经尝试使用tibble
包中的add_row
,但出现错误:
library(dpylr)
library(tibble)
df %>%
mutate(mean1 = mean(test_value)) %>%
add_row(test_id = test_id[1], test_nr=test_nr[1],region="mean", test_value=mean(test_value))
Error in eval_tidy(xs[[j]], mask) : object 'test_id' not found
你可以
library(dplyr)
df %>%
add_row(test_id = .$test_id[1], test_nr = .$test_nr[1], region = "mean", test_value = mean(.$test_value))
#> test_id test_nr region test_value
#> 1 1 1 A 3.00
#> 2 1 1 B 1.00
#> 3 1 1 C 1.00
#> 4 1 1 D 2.00
#> 5 1 1 mean 1.75
采用基础 R 方法,您可以构建现有行,然后 rbind
行绑定两个对象。
# save a new vector from any row you like
row_to_add <- df[1,]
# alter the values want one at a time
row_to_add$region <- "mean"
row_to_add$test_value <- mean(df$test_value)
# OR alter them at once if you prefer...
row_to_add[,c("region","test_value")] <- c("mean",mean(df$test_value))
# finally use rbind to add to the bottom of the data.frame
rbind(df,row_to_add)
如果我们想在不调用 .$
的情况下使用 OP 的方法,请使用 magrittr
中的 exposition pipe
(%$%
)。这与使用 with
(来自 base R
)
library(magrittr)
library(dplyr)
df %$%
add_row(., test_id = first(test_id), test_nr = first(test_nr),
region = "mean", test_value = mean(test_value))
test_id test_nr region test_value
1 1 1 A 3.00
2 1 1 B 1.00
3 1 1 C 1.00
4 1 1 D 2.00
5 1 1 mean 1.75