我想用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。
答案 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