Как создать фактор с тремя уровнями во фрейме данных в R? - PullRequest
0 голосов
/ 27 мая 2020

Я создал коэффициент для девятнадцати различных расстояний, и мне нужно определить три уровня: один для прямого удара (DirImp), другой для моих соответствующих расстояний непрямого воздействия (Dist = «1 км _», «2 км _», «3 км_», «4 км _», «5 км _», «6 км _», «7 км _», «8 км _», «9 км _», «10 км _», «10 км», «20 км», «30 км», «40 км», «50 км», «60 км. "," 70 км ") и другие в мою контрольную зону (Contrl), которые начинаются с расстояния 0 (DirImp) и увеличиваются в километре на километр до 10 км, с этой точки оно увеличивается каждые десять км, пока не достигнет 70 км. , и последнее расстояние - контрольное.

Итак, чтобы уточнить, в моем DataFrame у меня есть столбец (Dist), содержащий эти расстояния и другие столбцы с другой информацией, я использовал этот код, чтобы преобразовать его в коэффициент:

column Dist estructure:


levels(MY.DTAFRAME$Dist)
[1] "DirImp"   "10km"  "10km_" "1km_"  "20km"  "2km_"  "30km" 
[8] "3km_"  "40km"  "4km_"  "50km"  "5km_"  "60km"  "6km_" 
[15] "70km"  "7km_"  "8km_"  "9km_", "control" 

How I would like it to be:
level 1 = Direct impact ("DirImp")
level 2 = Distances ("1km_","2km_","3km_","4km_","5km_","6km_","7km_","8km_","9km_","10km_","10km","20km","30km","40km","50km","60km","70km")
level 3 = Contrl Area  ("Contrl")

Column Dist = ("DirImp", "1km_","2km_","3km_","4km_","5km_","6km_","7km_","8km_","9km_","10km_","10km","20km","30km","40km","50km","60km","70km", "control")

  MY.DATAFRAME$DistFact <- factor(MY.DATAFRAME$Dist, level ordered = TRUE)


  levels(MY.DTAFRAME$DistFact)
  [1] "DirImp"   "10km"  "10km_" "1km_"  "20km"  "2km_"  "30km" 
  [8] "3km_"  "40km"  "4km_"  "50km"  "5km_"  "60km"  "6km_" 
  [15] "70km"  "7km_"  "8km_"  "9km_", "control" 

1 Ответ

1 голос
/ 27 мая 2020

Требуется ли что-то вроде следующего?

forcats::fct_collapse(y, 
                      DirImp = grep("DirImp", y, ignore.case = TRUE, value = TRUE), 
                      Distances = grep("km", y, ignore.case = TRUE, value = TRUE),
                      Control = grep("control", y, ignore.case = TRUE, value = TRUE)
                      )
# [1] Distances Distances Distances Distances Distances Distances
# [7] Distances Distances Distances Distances Distances Distances
#[13] Distances Distances Distances Distances Distances Distances
#[19] Distances Distances Distances Distances Distances Distances
#[25] Distances Distances Distances Distances Control   Distances
#Levels: DirImp Distances Control

Или, может быть, более читабельно,

grep_tmp <- function(pattern, x){
  grep(pattern, x, ignore.case = TRUE, value = TRUE)
}

forcats::fct_collapse(y,
                      DirImp = grep_tmp("DirImp", y), 
                      Distances = grep_tmp("^\\d+km", y),
                      Control = grep_tmp("control", y)
                      )

Data

С levels, размещенным в вопросе, вот пример данных.

set.seed(1234)
x <- scan(text = '"DirImp"   "10km"  "10km_" "1km_"  "20km"  "2km_"  "30km" 
"3km_"  "40km"  "4km_"  "50km"  "5km_"  "60km"  "6km_" 
"70km"  "7km_"  "8km_"  "9km_" "control"', what = character())

y <- factor(sample(x, 30, TRUE), levels = x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...