поменять значения между столбцами, используя R - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть набор данных с именем cloud, который выглядит следующим образом:

"Rainfall, Treatment
274.7, Seeded
274.7, Seeded
Seeded, 255
242.5, Seeded
200.7, Seeded
198.6, Seeded
129.6, Seeded
119, Seeded
118.3, Seeded
115.3, Seeded
92.4, Seeded
40.6, Seeded
32.7, Seeded
31.4, Seded
17.5, Seeded"

Может ли кто-нибудь помочь мне:

  1. Поменять местами данные, где значениянеуместны (т. е. Rainfall == "Seeded" и Treatment == 255 следует поменять местами);и

  2. Исправьте написание значения в Treatment == "Seded" до "Seeded"

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Обзор

Я сохранил неуместные значения в двух отдельных векторах.Затем использовал три dplyr::if_else() вызова внутри dplyr::mutate() для очистки переменных по желанию.

# load necessary packages -----
library(tidyverse)

# load necessary data --------
cloud <-
  read_csv("Rainfall, Treatment
274.7, Seeded
           274.7, Seeded
           Seeded, 255
           242.5, Seeded
           200.7, Seeded
           198.6, Seeded
           129.6, Seeded
           119, Seeded
           118.3, Seeded
           115.3, Seeded
           92.4, Seeded
           40.6, Seeded
           32.7, Seeded
           31.4, Seded
           17.5, Seeded")

# store the misplaced text value
misplaced.text <-
  cloud %>% pull(Rainfall) %>% str_subset("^\\D.*$")

# store the misplaced numeric value
misplaced.numeric <-
  cloud %>% pull(Treatment) %>% str_subset("^\\d.*$")

# update cloud so that misplaced values are swapped -----
# and clean Treatment for mispellings
cloud.clean <-
  cloud %>%
  mutate(Rainfall = if_else(Rainfall %in% misplaced.text &
                              Treatment %in%  misplaced.numeric
                            , misplaced.numeric
                            , Rainfall) %>% as.double()
         , Treatment = if_else(Treatment %in%  misplaced.numeric
                               , misplaced.text
                               , Treatment)
         , Treatment = if_else(Treatment %in% "Seded"
                               , "Seeded"
                               , Treatment))

# view results ----
# note: tibble is only rounding the printed output in console
cloud.clean$Rainfall[1] # [1] 274.7
cloud.clean
# A tibble: 15 x 2
# Rainfall Treatment
#        <dbl> <chr>    
#  1    275.  Seeded   
#  2    275.  Seeded   
#  3    255   Seeded   
#  4    242.  Seeded   
#  5    201.  Seeded   
#  6    199.  Seeded   
#  7    130.  Seeded   
#  8    119   Seeded   
#  9    118.  Seeded   
# 10    115.  Seeded   
# 11     92.4 Seeded   
# 12     40.6 Seeded   
# 13     32.7 Seeded   
# 14     31.4 Seeded   
# 15     17.5 Seeded  

# end of script #
0 голосов
/ 25 сентября 2018

Используя меньший пример

df <- data.frame(Rainfall=c('Seeded', '31.4'),
                 Treatment=c('255', 'Seded'),
                 stringsAsFactors = F)
df

  Rainfall Treatment
1   Seeded       255
2     31.4     Seded

возможное решение:

# Swap values from col/col2 on row 1 (changing col order)
df[1, c(1,2)] <- df[1, c(2,1)]
# Rename Treatment value on row 2
df[2, c("Treatment")] <- 'Seeded'

df 

  Rainfall Treatment
1      255    Seeded
2     31.4    Seeded
0 голосов
/ 25 сентября 2018

Вам понадобится временная цифра, чтобы поменять местами

temp                <- cloud$Treatment[38]
cloud$Treatment[38] <- cloud$Rainfall[38]
cloud$Rainfall[38]  <- temp
temp                <- NULL

Вы также можете использовать этот метод для изменения орфографии:

cloud$Treatment[49] <- "Seeded"
...