Написание списка в .данные в R с помощью write.table

#r #list #file #for-loop #write.table

Вопрос:

Я пытаюсь записать список номеров, который создает этот цикл, в файл. Я, используя приведенный ниже код, смог это сделать, но результат не совсем то, что я ищу. Я знаю, что мне нужно использовать write.table, и его нужно сохранить как .dat

Кто-нибудь может сказать мне, почему «x» печатается между каждой строкой? **Что я получаю в файле:**
x
1800
x
1804
x
1808
x
и т. Д…

Чего я хочу:
1804
1808
1812
и т.д…

 years <- seq(1800,2020)

for (i in years){
  i_div_400 <- i%@0
  if (i_div_400 == 0 amp; (i%%4 == 0 amp;amp; i%0 != 0)){
    write.table(i, "file.dat", append=TRUE, sep=",", quote=FALSE)  
  }
}
 

Комментарии:

1. Вы уверены, что это тот результат, который вы получаете? i_div_400 == 0 это верно только раз в 400 лет. Это не должно было ничего писать. Но write.table ожидает, что напишет data.frame с именами столбцов и тому подобным. Если вы просто хотите написать буквальное значение, подумайте writeLines() об этом вместо этого. Кроме того, было бы более эффективно сгенерировать список значений, которые вы хотите записать, прежде чем вы его напишете.

2. Извините, вы правы, я отправил не тот сотовый раньше. Я отредактировал сообщение с правильным кодом

3. Почему вы делаете leap <- matrix(i) , когда вы нигде не используете leap ? Также я не понимаю, почему у вас есть два отдельных if условия, когда код внутри обоих if условий абсолютно одинаков.

4. эту матрицу следовало бы прокомментировать. если бы не работало как одна строка

Ответ №1:

Причина, по которой вы получаете «x» в выходных данных, заключается в том, что это имена столбцов по умолчанию при использовании write.table . Если вы не хотите включать имя столбца в выходные данные, используйте col.names = FALSE , и он будет печатать только цифры в выходных данных.

 years <- seq(1800,2020)

for (i in years){
  i_div_400 <- i%@0
  if (i_div_400 == 0 || (i%%4 == 0 amp;amp; i%0 != 0)){
    write.table(i, "file.dat", append=TRUE, sep=",", 
               row.names=FALSE, quote=FALSE, col.names = FALSE)  
  }
}
 

Также это может быть записано векторизованным способом без цикла.

 write.table(years[years %% 400 == 0 | (years %% 4 == 0 amp; years %0 != 0)], 
          "file.dat", sep=",", row.names=FALSE, quote=FALSE, col.names = FALSE)