R - Цикл по строкам фрейма данных + запись длинного текста в файл
Я борюсь с конкретным циклом for в R. У меня есть фрейм данных с 52 строками и примерно 30 столбцами. Я пишу цикл for для извлечения данных (или значений) из каждой строки и вставки их в длинный текст - в данном случае это код javascript/geojson. В настоящее время length() не принимает никаких аргументов, которые я ввел в нее.
Я новичок в R, поэтому большая часть этого кода может быть избыточной.
Код ниже:
# start of 'for loop'
for(row in 1:nrow(intro_df)) { # trying to iterate through each row of the df
lines <- vector(length()) # trying to deal with getting an error for "replacement has length zero"
# start of long text (notice placeholders in sprintf) --- javascript/geojson to be used in VS code later
lines[row] <- sprintf("
{
\"type\": \"Feature\",
\"properties\": {
\"huc8\": %s,
\"Year\": %i,
\"Total Water Use\": %f,
\"Aquaculture\": %f,
\"Commercial\": %f,
\"Self-Supplied Domestic\": %f,
\"Hydroelectric Power\": %f,
\"Self-Supplied Industrial\": %f,
\"Irrigation\": %f,
\"Livestock\": %f,
\"Mining\": %f,
\"Public Supply\": %f,
\"Thermoelectric\": %f,
\"Total Groundwater\": %f,
\"Total Surface Water\": %f
},
\"geometry\": {
\"type\": \"Point\",
\"coordinates\": [%f, %f]
}
}, \n",
intro_df$huc8[row], # column names where data/values from intro_df should be inserted into sprintf
intro_df$Year[row],
intro_df$Total_WaterUse[row],
intro_df$Aquaculture[row],
intro_df$Commercial[row],
intro_df$Domestic[row],
intro_df$Hydroelectric_power[row],
intro_df$Industrial[row],
intro_df$Irrigation[row],
intro_df$Livestock[row],
intro_df$Mining[row],
intro_df$Public_Supply[row],
intro_df$Thermoelectric[row],
intro_df$Total_Groundwater[row],
intro_df$Total_Surface_Water[row],
intro_df$lat[row],
intro_df$long[row])
}
all_lines <- paste(lines, collapse = "\n") # store lines to variable all_lines
file_js_points <- file("js_points.txt") # write all_lines to a text file
writeLines(all_lines, file_js_points)
close(file_js_points)
ИЗМЕНИТЬ Я исправил свой код, чтобы избавиться от цикла for. Ниже приведен код, который у меня сработал:
# Input data from each row of intro_df into placeholders in sprintf()
lines <- sprintf("
{
\"type\": \"Feature\",
\"properties\": {
\"huc8\": %s,
\"Year\": %s,
\"Total Water Use\": %s,
\"Aquaculture\": %s,
\"Commercial\": %s,
\"Self-Supplied Domestic\": %s,
\"Hydroelectric Power\": %s,
\"Self-Supplied Industrial\": %s,
\"Irrigation\": %s,
\"Livestock\": %s,
\"Mining\": %s,
\"Public Supply\": %s,
\"Thermoelectric\": %s,
\"Total Groundwater\": %s,
\"Total Surface Water\": %s
},
\"geometry\": {
\"type\": \"Point\",
\"coordinates\": [%s, %s]
}
}, \n",
intro_df$huc8, # column names where data/values from intro_df should be inserted into sprintf
intro_df$Year,
intro_df$Total_WaterUse,
intro_df$Aquaculture,
intro_df$Commercial,
intro_df$Domestic,
intro_df$Hydroelectric_power,
intro_df$Industrial,
intro_df$Irrigation,
intro_df$Livestock,
intro_df$Mining,
intro_df$Public_Supply,
intro_df$Thermoelectric,
intro_df$Total_Groundwater,
intro_df$Total_Surface_Water,
intro_df$lat,
intro_df$long)
# Collapse all rows into one variable separated by new line
js_points <- paste(lines, collapse = "\n")
# Create js_point text file for all js_points
sink(file = "js_points.txt")
cat(js_points)
sink()
1 ответ
Проблема в том, что вы сбрасываете lines
быть пустым в начале каждой итерации цикла. Вы должны инициализировать его (желательно до правильной длины, а не нулевой длины) перед циклом. И вам нужно использовать аргумент length =
не функция length()
. (Я также используюcharacter
так что это правильный тип вектора.)
lines = character(length = nrow(intro_df))
for(row in 1:nrow(intro_df)) {
lines[row] <- ...
}
Тем не менее,sprintf
векторизован, поэтому вам не понадобится for
петля вообще. я используюwith()
чтобы не вводить имя фрейма данных так много раз.
lines <- with(intro_df, sprintf("
{...
}",
huc8,
Year,
Total_WaterUse, ...
))
all_lines <- paste(lines, collapse = "\n") # store lines to variable all_lines
file_js_points <- file("js_points.txt") # write all_lines to a text file
writeLines(all_lines, file_js_points)
close(file_js_points)