2017-08-11 1 views
3

2つのデータファイルから特定の列を条件付きで追加することについて質問があります。条件付きで2つのデータファイルから特定のデータ列を追加する

データ1

ID purchased 
1 5 
2 3 
3 3 
4 3 
5 3 
6 4 
7 4 
8 4 
9 4 
10 4 

データ2つのファイルに2

ID Date3 Date4 Date5 
1 2014 2013 2017 
2 2014 2015 2012 
3 2013 2016 2014 
4 2015 2017 2014 
5 2016 2012 2017 
6 2017 2013 2017 
7 2012 2013 2012 
8 2014 2013 2014 
9 2014 2015 2014 
10 2015 2016 2015 

ので、購入欄の数字(データ1)リンクへ: はたとえば、私は、このデータファイルを持っています特定の日付。たとえば、購入したID 1(データ1)はID 1にリンクする必要があります。Date5(データ2)。 ID 2はID 2 Date3(データ2)など3つのリンクを購入しました。その結果は以下のようになります。

結果:

ID purchased Date 
1 5  2017 
2 3  2014 
3 3  2013 
4 3  2015 
5 3  2016 
6 4  2013 
7 4  2013 
8 5  2014 
9 5  2014 
10 4  2016 
私は以下のようなif文のカップルを使用して考えていた

:...私は間違ったアプローチを持って

if ((Data1$ID== Data2$ID) & Data1$purchased ==3) { 
    Data1$Date<- Data2$Date3 
} 

と4を購入し、5のための同じを考えます助けを感謝します!私はこれが理にかなってほしい。前もって感謝します。

+0

あなたの例の結果は、値8と9の最後のCOLで間違っていることに注意してください –

答えて

2

はたぶん、より美しい方法がありますが、このように行うことができます。

Data1$Date <- ifelse(Data1$purchased==3,Data2$Date3,ifelse(Data1$purchased==4,Data2$Date4,Data2$Date5)) 

条件はあなたがifelse文でIDに条件を挿入する必要はありませんので、あなたのIDがソートされていることです。

2

日付列のご注文は、あなたが試みることができる一定の昇順である場合:ご注文いただいた場合

k = match(Data1$purchased,as.numeric(gsub("Date","",colnames(Data2)[-1],fixed=TRUE))) 
Data1$year = sapply(seq_along(k),function(x) Data2[x,k[x]+1]) 
2

また、これは動作します:

k = Data1$purchased-1 
Data1$year = sapply(seq_along(k),function(x) Data2[x,k[x]]) 

それとも、あなたが列名で一致させたい場合IDの両方のデータフレームで異なっている:

df$Date = sapply(1:nrow(df), function(x) 
        df1[df1$ID==df$ID[x],paste0("Date",df$purchased[x])]) 

Outut:

ID purchased Date 
1 1   5 2017 
2 2   3 2014 
3 3   3 2013 
4 4   3 2015 
5 5   3 2016 
6 6   4 2013 
7 7   4 2013 
8 8   4 2013 
9 9   4 2015 
10 10   4 2016 

データ:dplyrmagrittrを使用して

df = read.table(text="ID purchased 
1 5 
2 3 
3 3 
4 3 
5 3 
6 4 
7 4 
8 4 
9 4 
10 4",header=T) 


df1 = read.table(text="ID Date3 Date4 Date5 
1 2014 2013 2017 
2 2014 2015 2012 
3 2013 2016 2014 
4 2015 2017 2014 
5 2016 2012 2017 
6 2017 2013 2017 
7 2012 2013 2012 
8 2014 2013 2014 
9 2014 2015 2014 
10 2015 2016 2015",header=T) 
0

:我々は最初のdata1purchased列の値を変更する

  • をので、それはその後、我々はmap2を使用data2
  • の列に一致します適切な要素を取得します。具体的には、map2_intにはvect

    :我々はDATA1を途中で接続し直していないよう

    library(magrittr) 
    library(dplyr) 
    data1 %>% 
        mutate(purchased=paste0("Date",purchased)) %$% 
        map2_int(ID,purchased, ~ data2[.x,.y]) %>% 
        cbind(data1,.) %>% 
        rename_("Date"= ".") 
    

    またはビット短く、多分より満足:または出力として、

  • その後、我々はdata2

コードにこのベクトルを追加します

data1 %>% 
    mutate(d=paste0("Date",purchased)) %$% 
    mutate(.,Date = map2_int(ID,d, ~ data2[.x,.y])) %>% 
    select(-d) 

そして1ライナー:

data1 %$% mutate(.,Date = map2(ID,purchased, ~ data2[.x,grep(.y,names(data2))])) 

結果:ここ

# ID purchased Date 
# 1 1   5 2017 
# 2 2   3 2014 
# 3 3   3 2013 
# 4 4   3 2015 
# 5 5   3 2016 
# 6 6   4 2013 
# 7 7   4 2013 
# 8 8   4 2013 
# 9 9   4 2015 
# 10 10   4 2016 
2

が方法1卑、

、いくつかの方法である - 方法2、tidyverse

df$Date <- diag(as.matrix(df1[match(df$purchased, sort(unique(df$purchased)))+1])) 

を照合することによってベクトル化 -

に参加
library(tidyverse) 

df1 %>% 
gather(var, val, -ID) %>% 
left_join(mutate(df, purchased = paste0('Date', purchased)), ., 
          by = c('ID' = 'ID', 'purchased' = 'var')) %>% 
mutate(purchased = gsub('\\D+', '', purchased)) 

両方ここで、

ID purchased Date 
1 1   5 2017 
2 2   3 2014 
3 3   3 2013 
4 4   3 2015 
5 5   3 2016 
6 6   4 2013 
7 7   4 2013 
8 8   4 2013 
9 9   4 2015 
10 10   4 2016 
0

を与える基地Rは行列抽出を使用ソト年代に似て応答です。

ここでは、dat2の内部の値、日付列をインデックスするために行列を使用します。最初にdat1のIDを照合して適切な行を選択し、dat2の列の位置を使用して減算によって適切な列を抽出します。我々はまた、DAT1で購入された変数の値を持つDAT2における変数名の最後の文字のマッチング・インデックスを見つけるために、第二引数にmatchを使用することができます

dat1 
    ID purchased Date 
1 1   5 2017 
2 2   3 2014 
3 3   3 2013 
4 4   3 2015 
5 5   3 2016 
6 6   4 2013 
7 7   4 2013 
8 8   4 2013 
9 9   4 2015 
10 10   4 2016 

これが返されます。これはより柔軟性があります。

dat1$Date <- dat2[cbind(match(dat1$ID, dat2$ID), 
         match(as.character(dat1$purchased), 
           substring(names(dat2), nchar(names(dat2)))))] 

データ

dat1 <- 
structure(list(ID = 1:10, purchased = c(5L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L)), .Names = c("ID", "purchased"), row.names = c(NA, 
-10L), class = "data.frame") 

dat2 <- 
structure(list(ID = 1:10, Date3 = c(2014L, 2014L, 2013L, 2015L, 
2016L, 2017L, 2012L, 2014L, 2014L, 2015L), Date4 = c(2013L, 2015L, 
2016L, 2017L, 2012L, 2013L, 2013L, 2013L, 2015L, 2016L), Date5 = c(2017L, 
2012L, 2014L, 2014L, 2017L, 2017L, 2012L, 2014L, 2014L, 2015L 
)), .Names = c("ID", "Date3", "Date4", "Date5"), class = "data.frame", 
row.names = c(NA, -10L)) 
関連する問題