Привет! Я пытаюсь узнать, как избежать циклов в моих кодах.
У меня есть пример данных:
options(warn=-1) #Turning warnings off here
Company=c("A","C","B","B","A","C","C","A","B","C","B","A")
CityID=as.character(c(1,1,1,2,2,2,3,3,3,4,4,4))
Value=c(120.5,123,125,122.5,122.1,121.7,123.2,123.7,120.7,122.3,120.1,122)
Sales=c(1,1,0,0,0,1,1,0,1,0,1,0)
df=data.frame(Company,CityID,Sales,Value)
df$new_value=0
Я также создал пользовательскую функцию (просто Пример только для тестирования), как показано ниже.
funcCity12 = function(data){
data_new=data[which(data$CityID == '1'|data$CityID == '2'),]
for (i in 1:nrow(data_new)){
data_company=df[(df$Company)==data_new[i,'Company'] & !df$CityID==1 & !df$CityID==2,]
data_new[i,'new_value'] = max(data_company[data_company$Sales==1,]$Value) #Note we take the maximum value here
}
data_new
}
df2=funcCity12(data=df) # obtaining the result here
Теперь я пытаюсь написать функцию, чтобы избежать для l oop в предыдущей функции.
funcCity12_no_loop = function(x,df){
data_company=df[(df$Company)==x[,'Company'] & !df$CityID==1 & !df$CityID==2,]
x[,'new_value'] = max(data_company[data_company$Sales==1,]$Value) #Note we take the maximum value here
x
}
funcCity12_no_loop(x=df[1,],df=df) #Output for the first row of df1
Это кажется работать при вводе строк по отдельности. Я застрял в том, как запустить эту функцию для всех строк информационного кадра. Я не уверен, что 2-я функция требует больше изменений для этой цели. Любая помощь приветствуется. Заранее спасибо.
PS Для второй функции моей первоначальной реакцией было создание для l oop и l oop посредством наблюдений, но это разрушает всю цель.
РЕДАКТИРОВАТЬ
Это основано на ответе @ eonurk
zz=apply(df,1, function(x){
data_company=df[(df$Company)==x[1] & !df$CityID==1 & !df$CityID==2,]
x[5] = max(data_company[data_company$Sales==1,]$Value) #Note we take the maximum value here
x
})
Вывод показан ниже: