如何避免在R中合并

时间:2016-02-11 11:51:21

标签: r

我有两个向量,arg2df以及一个数据框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

我想在我的数据框中包含arg2arg1的信息但不合并。 此处的关键任务是将arg2arg1的第一个值与a的值1相关联,第二个值arg2df <- data.frame(a = c(1, 1, 2, 2, 3, 3, 4, 4), d = c(1, 1, 1, 1 ,2, 2, 2, 2), e = c(1, 1, 2, 2, 1, 1, 2, 2)) 的值为2等等。

最终输出:

df$d <- as.character(factor(a, labels = arg1))

如果我是arg1和arg2的unicity,我会这样做:

arg1

我认为这样做的经典方法是将arg2#include <iostream> //#include <unistd.h> using namespace std; int main() { //sleep(3); int number; cout << "Doing The Fibonacci Sequence"; //sleep(5); cout << ""<<endl; cin>>number; int a=1; int b=1; for (int num=1; num < number-1; num++) { int c=a+b; cout << a << " + " << b << " = " << c <<endl; a=b; b=c; } return 0; } 转换为数据框并与df合并。但这个解决方案看起来有点沉重。有没有办法只使用向量分配?

2 个答案:

答案 0 :(得分:4)

您可以使用存储为整数的因子:

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

我假设列a中的值可能不同于1:4,在这种情况下,这会将a中的第一个唯一值与arg1中的第一个值相匹配,分别为arg2

正如@ A.Webb在评论中指出的那样,使用

会更容易
i <- match(df$a,unique(df$a))

而不是转换为因子和整数。

答案 1 :(得分: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])

data.table

library(data.table)
setDT(df)[, c('d', 'e') := list(a,arg1[.GRP], arg2[.GRP]) ,.(a)]