2017-08-11 75 views
3

我有两个数据文件有条件添加某个列的问题。 举例来说,我有这个数据文件:有条件地添加两个数据文件中的某些数据列

数据1

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

数据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)链接一个特定的日期。例如,购买5(数据1)的ID 1应链接到ID 1日期5(数据2); ID 2购买了3个链接到ID 2日期3(数据2)等,所以结果如下所示。

结果:

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 ((Data1$ID== Data2$ID) & Data1$purchased ==3) { 
    Data1$Date<- Data2$Date3 
} 

并购买了4和5做同样的...我想我有错误的做法并感谢任何帮助!我希望这是有道理的。先谢谢你。

+0

请注意您的例子的结果是错在值8,9最后关口 –

回答

2

也许还有一个更华丽的方式,但你可以这样做:

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

的条件是你的ID进行排序,所以你并不需要插入状态的ID在ifelse声明。

2

如果你的日期列的顺序是在不断上升的顺序,你可以尝试:

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

或者,如果你想通过列名匹配:

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

这也适用,如果顺序

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

Outut:的ID在这两个dataframes是不同

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 

数据:

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

使用dplyrmagrittr

  • 我们首先更改data1purchased列值,所以它的data2
  • 然后我们用map2的列相匹配得到正确的元素,更具体地说map2_int有一个vect或作为输出,
  • 那么我们这个向量追加到data2

代码:

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

或短一点,也许更令人满意的,因为我们不重新插上数据1中途:

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

和一个衬里:

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,贝塞 - 通过匹配

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

方法2量化,tidyverse - 加入

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答案。

dat1$Date <- dat2[cbind(match(dat1$ID, dat2$ID), dat1$purchased - 1)] 

在这里,我们使用一个矩阵来索引dat2中日期列的值。我们首先匹配dat1中的ID以选择适当的行,然后使用dat2中列的位置以便通过减法提取适当的列。

这将返回

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 

我们还可以使用match第二个参数中找到DAT2与DAT1购买变量的值的变量名的最后一个字符的匹配指标。这可能更灵活。

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)) 
相关问题