【问题标题】:Populate a dataframe with a for loop使用 for 循环填充数据框
【发布时间】:2016-07-07 12:49:47
【问题描述】:

我想用 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$Code 的形式出现在 "df" 中。

【问题讨论】:

标签: r loops matrix fill


【解决方案1】:

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

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

【讨论】:

  • 嗨,非常感谢您的帮助。您的代码运行良好,但我认为我的问题表达得不太好(这并不容易)。你可以看到更新。
  • 太棒了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多