2017-02-17 3 views
1

Я изучаю for loop в R. Я пытаюсь понять, как сделать for loop в конкретном variable в data.frame. Я рассмотрел несколько примеров в stackoverflow, таких как Q1, Q2, Q3, но никто не полезен, что я ищу!Как выполнить цикл for для переменной в data.fame?

В качестве примера, используя mtcars набор данных, скажем, я хочу, чтобы выполнить for loop в:

взгляд в cyl и определить для cyl 4,6,8, записи и замены с strings (low, medium, high), соответственно.

for (i in mtcars$cyl) { 
    if (mtcars$cyl == 4){ 
    print("low")} 
    if (mtcars$cyl == 6) { 
    print ("medium")} 
    if (mtcars$cyl == 8) { 
    print ("high")} 
    } 

Конечно, это не тот случай!

, что ожидается, что-то вроде этого:

    mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

новообращенным:

    mpg cyl  disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 medium 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 medium 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 low  108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 medium 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 high  360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 medium 225 105 2.76 3.460 20.22 1 0 3 1 

Любая помощь с объяснения высоко ценится!

+3

Нет необходимости циклов: 'mtcars $ Newcol <- фактор (mtcars $ цил, этикетки = с ("низкий"," средний "," высокий "))' См. '? factor' для деталей. – Frank

+1

Таким образом, обычно предпочитают избегать петель, где это возможно, в Р. Вот почему ответ Фрэнкса и первая часть ответа Д.Б. действительно являются более правильными решениями. Вместо того, чтобы проводить время с циклами, которые медленнее и в конечном итоге становятся намного более сложными, рассмотрите возможность использования функции времени для обучения и удобство использования группы функций «apply». Они превосходят FAR, когда дело доходит до аккуратности и удобочитаемости кода, а также от скорости, с которой они могут выполнять данную операцию. – SeldomSeenSlim

+0

@AronBoettcher благодарит за конструктивный совет! – Daniel

ответ

4

Эта конкретная операция возможна без цикла.

df = mtcars 
df$cyl[df$cyl == 4] = "low" #Subset the cyl values equal to 4 and assign 'low' 
#Repeat for other values 

Но для запуска цикла, я бы о как этот

df = mtcars 

for (i in 1:length(df$cyl)) { #Iterate over the length of df$cyl 
#You could also do "for (i in seq_along(df$cyl)" 
#Run "seq_along(df$cyl)" and "1:length(df$cyl)" to understand what values are being generated 
    if (df$cyl[i] == 4){ #Index df$cyl by [i]. If the ith value is 4, assign 'low' 
     df$cyl[i] = "low" 
    } 
    if (df$cyl[i] == 6) { 
     df$cyl[i] = "medium" 
    } 
    if (df$cyl[i] == 8) { 
     df$cyl[i] = "high" 
    } 
} 
+4

Небольшая вещь: помогая начинающим, старайтесь поощрять такие шаблоны, как 'for (i in seq_along (df $ cyl)', а не 'for (i in 1: length (df $ cyl))'. – joran

+0

@joran, Спасибо! –

+1

@db, Большое спасибо за объяснение! :) – Daniel