R - 使用数值向量的现有名称和现有数据将计算列添加到 table
R - Adding calculated columns to a table using existing names of a numeric vector and existing data
您好,我有一个 table (data1) 和一个数值向量 (quantile),并尝试使用现有数据 (data1) 和向量 (quantile) 附加计算列。
这样:
newcol_20% = col1 + col2 + 20%,
newcol_50% = col2 + col3 + 50%,
newcol_70% = col3 + col4 + 70%
data1 和 分位数
所需的输出(out)如下
>data1
ID col1 col2 col3 col4
ABC124 10 15 6 15
ABC445 8 8 25 34
ABC550 10 15 5 12
---
ZZZ980 12 21 26 11
ZZZ999 22 19 11 8
> quantile
20% 50% 70%
10 21 35
> out
ID col1 col2 col3 col4 newcol_20% newcol_50% newcol_70%
ABC124 10 15 6 15 35 42 56
ABC445 8 8 25 34 26 54 94
ABC550 10 15 5 12 35 41 52
---
ZZZ980 12 21 26 11 43 68 72
ZZZ999 22 19 11 8 51 51 54
我如何使用 base R 执行上述操作?
任何帮助,建议将不胜感激,谢谢!
一个非常简单有效的方法是使用 dplyr 包中的 mutate() 函数:
library(dplyr)
new_df <- df %>% mutate(new_col_20 = col1 + col2 + 10,
newcol_50 = col2 + col3 + 21,
newcol_70 = col3 + col4 + 35
)
但是,如果需要使用基本 R,您可以使用 $:
分配一个新列
df$new_col_20 <- df$col1 + df$col2 + 10
其他两列也类似。
PS。列名不接受“%”符号。
这是一个基本的 R 解决方案,可以推广到任意数量的列和向量元素:
src_cols <- data1[-1]
qnt_names <- names(quantile)
for (i in seq_along(src_cols)) {
if (i < ncol(src_cols)) {
data1[[paste0("newcol_", qnt_names[[i]])]] <- src_cols[[i]] + src_cols[[i + 1]] + quantile[[i]]
}
}
结果:
ID col1 col2 col3 col4 newcol_20% newcol_50% newcol_70%
1 ABC124 10 15 6 15 35 42 56
2 ABC445 8 8 25 34 26 54 94
3 ABC550 10 15 5 12 35 41 52
4 ZZZ980 12 21 26 11 43 68 72
5 ZZZ999 22 19 11 8 51 51 54
在 base R 中你可以使用 transform。
qs <- c(10, 21, 35)
dat <- transform(dat,
newcol_20=col1 + col2 + qs[1],
newcol_50=col2 + col3 + qs[2],
newcol_70=col3 + col4 + qs[3])
dat
# ID col1 col2 col3 col4 newcol_20 newcol_50 newcol_70
# 1 ABC124 10 15 6 15 35 42 56
# 2 ABC445 8 8 25 34 26 54 94
# 3 ABC550 10 15 5 12 35 41 52
# 4 ZZZ980 12 21 26 11 43 68 72
# 5 ZZZ999 22 19 11 8 51 51 54
PS:避免名字中的特殊字符,查看?make.names
快速了解有效名字的规则。
dat <- structure(list(ID = c("ABC124", "ABC445", "ABC550", "ZZZ980",
"ZZZ999"), col1 = c(10L, 8L, 10L, 12L, 22L), col2 = c(15L, 8L,
15L, 21L, 19L), col3 = c(6L, 25L, 5L, 26L, 11L), col4 = c(15L,
34L, 12L, 11L, 8L)), class = "data.frame", row.names = c(NA,
-5L))
您好,我有一个 table (data1) 和一个数值向量 (quantile),并尝试使用现有数据 (data1) 和向量 (quantile) 附加计算列。
这样:
newcol_20% = col1 + col2 + 20%,
newcol_50% = col2 + col3 + 50%,
newcol_70% = col3 + col4 + 70%
data1 和 分位数 所需的输出(out)如下
>data1
ID col1 col2 col3 col4
ABC124 10 15 6 15
ABC445 8 8 25 34
ABC550 10 15 5 12
---
ZZZ980 12 21 26 11
ZZZ999 22 19 11 8
> quantile
20% 50% 70%
10 21 35
> out
ID col1 col2 col3 col4 newcol_20% newcol_50% newcol_70%
ABC124 10 15 6 15 35 42 56
ABC445 8 8 25 34 26 54 94
ABC550 10 15 5 12 35 41 52
---
ZZZ980 12 21 26 11 43 68 72
ZZZ999 22 19 11 8 51 51 54
我如何使用 base R 执行上述操作? 任何帮助,建议将不胜感激,谢谢!
一个非常简单有效的方法是使用 dplyr 包中的 mutate() 函数:
library(dplyr)
new_df <- df %>% mutate(new_col_20 = col1 + col2 + 10,
newcol_50 = col2 + col3 + 21,
newcol_70 = col3 + col4 + 35
)
但是,如果需要使用基本 R,您可以使用 $:
分配一个新列df$new_col_20 <- df$col1 + df$col2 + 10
其他两列也类似。
PS。列名不接受“%”符号。
这是一个基本的 R 解决方案,可以推广到任意数量的列和向量元素:
src_cols <- data1[-1]
qnt_names <- names(quantile)
for (i in seq_along(src_cols)) {
if (i < ncol(src_cols)) {
data1[[paste0("newcol_", qnt_names[[i]])]] <- src_cols[[i]] + src_cols[[i + 1]] + quantile[[i]]
}
}
结果:
ID col1 col2 col3 col4 newcol_20% newcol_50% newcol_70%
1 ABC124 10 15 6 15 35 42 56
2 ABC445 8 8 25 34 26 54 94
3 ABC550 10 15 5 12 35 41 52
4 ZZZ980 12 21 26 11 43 68 72
5 ZZZ999 22 19 11 8 51 51 54
在 base R 中你可以使用 transform。
qs <- c(10, 21, 35)
dat <- transform(dat,
newcol_20=col1 + col2 + qs[1],
newcol_50=col2 + col3 + qs[2],
newcol_70=col3 + col4 + qs[3])
dat
# ID col1 col2 col3 col4 newcol_20 newcol_50 newcol_70
# 1 ABC124 10 15 6 15 35 42 56
# 2 ABC445 8 8 25 34 26 54 94
# 3 ABC550 10 15 5 12 35 41 52
# 4 ZZZ980 12 21 26 11 43 68 72
# 5 ZZZ999 22 19 11 8 51 51 54
PS:避免名字中的特殊字符,查看?make.names
快速了解有效名字的规则。
dat <- structure(list(ID = c("ABC124", "ABC445", "ABC550", "ZZZ980",
"ZZZ999"), col1 = c(10L, 8L, 10L, 12L, 22L), col2 = c(15L, 8L,
15L, 21L, 19L), col3 = c(6L, 25L, 5L, 26L, 11L), col4 = c(15L,
34L, 12L, 11L, 8L)), class = "data.frame", row.names = c(NA,
-5L))