Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免R中的合并_R - Fatal编程技术网

如何避免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)]
那么,否?