2016-07-07 2 views
0

Я хотел бы заполнить dataframe («DF») с помощью 0 или 1, если значения в векторе («Дата») совпадают с другими значениями даты во втором ядре данных («df $ Дата"). Если они совпадают выходное значение должно быть 1, иначе 0.Заполнение кадра данных с помощью цикла for

Я пытался настроить этот код, сделанный моего друг, но он не работает:

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 
    } 

Основной dataframe " DF "имеет 190 столбцов, которые должны быть заполнены, и, конечно, несколько строк, равных вектору Date.


дополнительная информация


1) Каждый столбец отличается от других, и поэтому наблюдений в ряде не может быть все равны (т.е. в одной строке, у меня должен быть смесь между 0 и 1). 2) Названия столбцов в «DF» также присутствуют в «df» как df $ Code.

+0

Может 'применить (MAT, 2, функция (я) as.numeric (я == Дата)) ' – zx8754

+0

[Как сделать отличный R воспроизводимый пример?] (Http://stackoverflow.com/questions/5963269) – zx8754

ответ

0

Мы можем векторизации эту операцию с %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 
+0

привет, большое спасибо за вашу помощь. ваш код работает отлично, но я думаю, что я не очень хорошо ответил на мой вопрос (это непросто). Вы можете увидеть обновление. –

+0

@ user181187 См. Редактирование. – bgoldst

+0

отлично. Большое спасибо. –