如何避免R中的合并
我有两个向量,如何避免R中的合并,r,R,我有两个向量,arg1和arg2以及一个数据帧df arg1 <- c(1, 1, 2, 2) arg2 <- c(1, 2, 1, 2) df <- data.frame(a <- c(1, 1, 2, 2, 3, 3, 4, 4)) 如果我是arg1和arg2的唯一性,我会: df$d <- as.character(factor(a, labels = arg1)) df$d您可以使用存储为整数的因子: i <- as.integer(factor
arg1
和arg2
以及一个数据帧df
arg1 <- c(1, 1, 2, 2)
arg2 <- c(1, 2, 1, 2)
df <- data.frame(a <- c(1, 1, 2, 2, 3, 3, 4, 4))
如果我是arg1和arg2的唯一性,我会:
df$d <- as.character(factor(a, labels = arg1))
df$d您可以使用存储为整数的因子:
i <- as.integer(factor(df$a, levels = unique(df$a)))
cbind(df,
d = arg1[i],
e = arg2[i])
# a d e
#1 1 1 1
#2 1 1 1
#3 2 1 2
#4 2 1 2
#5 3 2 1
#6 3 2 1
#7 4 2 2
#8 4 2 2
不要转换为因子和整数。您可以使用存储为整数的因子:
i <- as.integer(factor(df$a, levels = unique(df$a)))
cbind(df,
d = arg1[i],
e = arg2[i])
# a d e
#1 1 1 1
#2 1 1 1
#3 2 1 2
#4 2 1 2
#5 3 2 1
#6 3 2 1
#7 4 2 2
#8 4 2 2
而不是转换为因子和整数。我们可以使用Map
do.call(rbind, Map(cbind, split(df$a, df$a),
d=arg1, e= arg2))
或者使用dplyr
library(dplyr)
df %>%
mutate(d=arg1[a], e= arg2[a])
或使用数据。表格
library(data.table)
setDT(df)[, c('d', 'e') := list(a,arg1[.GRP], arg2[.GRP]) ,.(a)]
我们可以使用Map
do.call(rbind, Map(cbind, split(df$a, df$a),
d=arg1, e= arg2))
或者使用dplyr
library(dplyr)
df %>%
mutate(d=arg1[a], e= arg2[a])
或使用数据。表格
library(data.table)
setDT(df)[, c('d', 'e') := list(a,arg1[.GRP], arg2[.GRP]) ,.(a)]
如果a
已经是整数,为什么要先转换为因子,然后再转换回整数?e、 例如,cbind(df,d=arg1[df$a],e=arg2[df$a])
应该返回相同的值。@davidernburg,因为a中可能有不同于1:4的值,否?@YCR,我做了一个小编辑-请注意。如果“a”中的值未按升序排列,则必须执行此操作以确保正确排序如果a
已经是整数,为什么要先转换为因子,然后再转换回整数?e、 例如,cbind(df,d=arg1[df$a],e=arg2[df$a])
应该返回相同的值。@davidernburg,因为a中可能有不同于1:4的值,否?@YCR,我做了一个小编辑-请注意。如果“a”中的值没有按升序排列,这是确保正确排序所必需的。dplyr
一个似乎是非常复杂的转换版本(df,d=arg1[a],e=arg2[a])
@DavidArenburg,但问题是它使用了神奇的操作符%>%
,我想你可以直接执行setDT(df)[,c]('b','d'):=(arg1[a],arg2[a])]
带数据。表
,否?@davidernburg是的,但以防万一,'a'列是c(5,5,6,6,7,7,8,8)或一些其他字符值。我明白了,那么它只是setDT(df)[,c('b',d'):=(arg1[.GRP],arg2[.GRP]),by=(a)]
那么,不是吗?dplyr
一个看起来像是一个非常复杂的转换版本(df,d=arg1[a],e=arg2[a])
@DavidArenburg但是,关键是它使用了魔法操作符%>%
,我想你可以做setDT(df)[,c('b',d'):=(arg1[a],arg2[a])
带有数据。表
,否?@davidernburg是的,但以防万一,'a'列是c(5,5,6,6,7,7,8,8)
或其他一些字符值。我明白了,那么它只是setDT(df)[,c('b',d'):=(arg1[.GRP],arg2[.GRP]),by=(a)]
那么,否?