Начиная со строки 2, столбца 2, мне нужно, чтобы числовые значения были разделены на оставшиеся столбцы (2:7).
Это данные
structure(list(State = c("State", "Alabama ", "Alaska ", "Arizona ",
"Arkansas ", "California "), `Number of farms 2022` = c("number",
"37,400 37,100 8,600 8,600 230 232", "1,200 1,200 870 870 725 725",
"16,700 16,400 25,500 25,000 1,527 1,524", "37,800 37,400 13,700 13,700 362 366",
"63,100 62,900 24,200 23,800 384 378"), `Number of farms 2023` = c("number",
NA, NA, NA, NA, NA), `Land in farms 2022` = c("1,000 acres",
NA, NA, NA, NA, NA), `Land in farms 2023` = c("1,000 acres",
NA, NA, NA, NA, NA), `Average farm size 2022` = c("acres", NA,
NA, NA, NA, NA), `Average farm size 2023` = c("acres", NA, NA,
NA, NA, NA)), row.names = c(NA, 6L), class = "data.frame")
Я хочу, чтобы это выглядело примерно так:
State | Number of farms 2022 | Number of farms 2023 | Land in farms 2022 | Land in farms 2023 | Average farm size 2022 | Average farm size 2023
State | number | number | 1,000 acres | 1,000 acres | acres | acres
Alabama | 37,400 | 37,100 | 8,600 | 8,600 | 230 | 232
Поскольку у меня есть несколько файлов за разные годы, мне нужно, чтобы этот код можно было легко применить ко всем из них.
Я видел такие коды
library(dplyr)
library(tidyr)
df %>% separate(player, c('First', 'Last'))
но я не уверен, как применить его к моему фрейму данных, поскольку столбцы уже названы.
Не уверен, что это поможет, но исходные данные взяты с сайта Министерства сельского хозяйства США от 16 февраля 2024 г.: https://usda.library.cornell.edu/concern/publications/5712m6524
Затем я загружаю его вот так
library(tidyr)
library(dplyr)
library(splitstackshape)
df = read.delim('file.txt', header = F, stringsAsFactors = F)
df=df[106:167,]
df=data.frame(df)
df = cSplit(df, "df",":")
И оттуда выполнить массу обработки. Мне нужен текстовый файл, потому что я создаю временной ряд, а ZIP-файлы Министерства сельского хозяйства США относятся только к 2002 году.
Исходный текстовый файл взят с веб-сайта Министерства сельского хозяйства США от 16 февраля 2024 г.: usda.library.cornell.edu/concern/publications/5712m6524. Я прочитал это так: df = read.delim('file.txt', header = F, stringsAsFactors = F) df=df[106:167,] df=data.frame(df) library(splitstackshape) f = cSplit(df, "df",":")
и процесс оттуда.
Поскольку речь идет об очистке/подготовке данных, read_fwf
может быть подходящим инструментом для этой работы.
library(readr)
library(dplyr)
read_fwf(file = "fnlo0224.txt",
col_positions = fwf_positions(c(1, 21, 30, 40, 49, 59, 68),
c(20, 29, 39, 48, 58, 67, 77)),
skip_empty_rows = TRUE)[109:163,] %>%
rename_with(~ c("state", "nfarms2022", "nfarms2023",
"landinfarms2022", "landinfarms2023", "avgfarmsize2022",
"avgfarmsize2023")) %>%
mutate(state = trimws(sub("\\..*:", "", state)),
across(-state, ~ as.numeric(sub(",", "", .x)))) %>%
filter(state != ":")
# A tibble: 50 × 7
state nfarms2022 nfarms2023 landinfarms2022 landinfarms2023 avgfarmsize2022
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Alabama 37400 37100 8600 8600 230
2 Alaska 1200 1200 870 870 725
3 Arizona 16700 16400 25500 25000 1527
4 Arkans… 37800 37400 13700 13700 362
5 Califo… 63100 62900 24200 23800 384
6 Colora… 36100 35900 30200 30000 837
7 Connec… 5100 5100 370 370 73
8 Delawa… 2150 2150 520 520 242
9 Florida 44700 44400 9700 9700 217
10 Georgia 39200 39000 10000 10000 255
# ℹ 40 more rows
# ℹ 1 more variable: avgfarmsize2023 <dbl>
# ℹ Use `print(n = ...)` to see more rows
Если у вас есть несколько файлов, вы можете просто cat
соединить их в оболочке, импортировать с помощью read_fwf
и отфильтровать по номеру строки.
Это ФАНТАСТИКА!! Я заметил, что здесь нет значений США, поэтому я изменил 163 на 164. В результате первые два значения США из первых двух столбцов исчезнут. Есть идеи, как это исправить?
Это будет легче исправить в восходящем направлении, если это вариант для вас. Как вы загружаете данные?