使用for循环填充数据框

时间:2016-07-07 12:49:47

标签: r loops matrix fill

我想用0或1来填充数据帧(“DF”),这取决于向量中的值(“日期”)是否与第二个数据帧中的其他日期值匹配(“df $ Date”)。 如果它们匹配,则输出值必须为1,否则为0。

我尝试调整我的朋友制作的代码,但它不起作用:

for(j in 1:length(Date)) {  #Date is a vector with all dates from 1967 to 2006
    # Start count
    count <- 0
    # Check all Dates between 1967-2006
    if(any(Date[j] == df$Date)) { #df$Date contains specific dates of interest
      count <- count + 1
    }
    # If there is a match between Date and df$Date, its output is 1, else 0.
    DF[j,i] <- count
  }

主数据帧“DF”有190列,必须填充,当然还有一些行等于日期向量。

额外信息

1)每列与其他列不同,因此连续观察不能全部相等(即在一行中,我应该在0和1之间有一个混合)。 2)“DF”中的列名也在“df”中显示为df $ Code。

1 个答案:

答案 0 :(得分:0)

我们可以使用%in%as.integer()对此操作进行向量化,利用将逻辑强制转换为整数的事实,返回0表示false,1表示true表示:

Mat[,i] <- as.integer(Date%in%df$Date);

如果您想使用完全相同的结果向量填充Mat的每一列:

Mat[] <- as.integer(Date%in%df$Date);

我的上述代码完全重现了(原始)问题中代码的逻辑。

从你的编辑中,我并不是100%确定我理解这个要求,但我最好的猜测是:

set.seed(4L);
LV <- 10L; ND <- 10L;
Date <- sample(seq_len(ND),LV,T);
df <- data.frame(Date=sample(seq_len(ND),3L),Code=c('V1','V2','V3'));
DF <- data.frame(V1=rep(NA,NV),V2=rep(NA,NV),V3=rep(NA,NV));
Date;
##  [1]  6  1  3  3  9  3  8 10 10  1
df;
##   Date Code
## 1    8   V1
## 2    3   V2
## 3    1   V3
for (cn in colnames(DF)) DF[,cn] <- as.integer(Date%in%df$Date[df$Code==cn]);
DF;
##    V1 V2 V3
## 1   0  0  0
## 2   0  0  1
## 3   0  1  0
## 4   0  1  0
## 5   0  0  0
## 6   0  1  0
## 7   1  0  0
## 8   0  0  0
## 9   0  0  0
## 10  0  0  1