Как я могу сделать что-то вроде foreach в Stata, используя R? - PullRequest
2 голосов
/ 29 мая 2019

Я новичок в R и использую Stata. Я могу перебирать переменные, используя foreach и forvalue в Stata.

Я бы хотел зациклить столбец, а не зациклить на строке. Например, у меня есть столбец с именем var1, var2, var3. И данные, как показано ниже:

var1 var2 var3
  1    1   1   
  2   999  3
 999   2  999

Я хотел бы перекодировать все значения "999" в переменных в отсутствующие. В стате я могу сделать

forvalue i = 1(1)3{
  replace var`i' ="NA" if var`i' =="999"
}

Поэтому у меня есть результат как

var1 var2 var3
  1    1   1   
  2   NA   3
  NA   2  NA

Кроме того, если у меня есть столбец с именем ht, wgt, bmi, я хотел бы вычислить среднее значение столбца и сохранить среднее значение в новом столбце с соответствующим именем. Набор данных, как показано ниже:

 ht     wgt   bmi
154.5  43.1 18.1
164.2  63   23.4

В Stata я могу сделать

foreach i of varlist ht wgt bmi{
  gen `i'mean = mean(`i')
}

И результат будет

 ht    wgt   bmi  htmean wgtmean bmimean
154.5  43.1 18.1  159.35  53.05   20.75
164.2  63   23.4  159.35  53.05   20.75

Я не знаю, как это сделать с помощью R.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Есть много разных способов сделать такие вещи.Например, для роста, веса, например, BMI, вы можете сделать это в основном так же, как в Stata, используя цикл for:

# For-loop approach
for (col in c("ht", "wgt", "bmi")) {
    new_col = paste0(col, "_mean")
    df2[, new_col] = mean(df2[, col])
}

Разница в том, что между кодами в коде существует более сильное разделениеи строки в R, поэтому вы задаете имена столбцов в виде строк, используйте paste0 для создания строк, представляющих новые имена столбцов, а затем добавляете их в фрейм данных.

Другой способ сделать это - использовать *Пакет 1008 * и функция mutate_at, которые будут применять одно и то же преобразование к нескольким столбцам:

library(dplyr)

df2 %>%
    mutate_at(c("ht", "wgt", "bmi"), 
              list(mean = ~ mean(.)))

Синтаксис немного сложен: сначала мы даем имена столбцов, затем следующий аргумент показывает, как мыхочу преобразовать столбцы.. является заполнителем для текущего столбца, ~ означает, что R не будет сразу пытаться вычислить mean(.), но будет ждать, пока у нас не появится действительные значения для замены. Когда мы используем список и присваиваем имя преобразованиюкак list(transform = ~ . + 2), dplyr автоматически использует имя в качестве суффикса, поэтому вы получаете имена столбцов, такие как x_transform, y_transform и т. д.

1 голос
/ 29 мая 2019

Итак, несколько вариантов здесь.Я настоятельно рекомендую добавить некоторые образцы данных, чтобы мы могли лучше помочь вам.В зависимости от того, что вы делаете, вы можете сделать несколько вещей:

library(dplyr)
mtcars %>% 
    mutate(my_hp = case_when(
        hp<50~"Small",
        hp < 100~"Medium",
        TRUE~"Large"
    ))

Это относится к условной логике: используйте функцию mutate для создания новой переменной (столбца) и функцию case_when для использования в разных случаях.в зависимости от значения hp.

Кроме того, вы можете использовать базовый подход R, который может выглядеть как

mtcars$my_hp <- ifelse(mtcars$hp < 50, "Small",
                                             ifelse(mtcars$hp< 100, "Medium",
                                                         "Large"))

Так что в этом случае вы создаете новое значение с именем my_hpиспользуя цепочечные операторы ifelse, которые проверяют условие.

И если вы абсолютно хотите сделать цикл, который вам не понадобится в этом случае, вы можете сделать что-то вроде:

for( i in 1:nrow(mtcars)){
    mtcars$my_hp[i] <- ifelse(mtcars$hp[i] < 50, "Small",
                                                            ifelse(mtcars$hp[i]< 100, "Medium",
                                                                         "Large"))

}
...