2017-11-03 16 views
1

Rのコースで働いていますが、私は解決できないようなコースで問題を見つけました。Rサブセットとデータフレーム内のタグデータ

私はdelivery_dataと読み込まれたcsvファイルを持っています。pickup_zipcodeが94107のすべての行を見つけて、 "Whole Foods Market"、 "Safeway"、または "またはpickup_nameフィールドに「Pizzeria Delfina」と入力します。次に、pickup_nameをホットスポットとしてタグ付けします。

は、ここで私が試したコードです:

delivery_data = read.csv('Delivery_Data_Problem.csv') 

#created vector to hold the text values I'm looking for 
hotspot_locations = c("Whole Foods Market", "Safeway", "Pizzeria Delfina") 
pickup_sub = list() #init as list 

#running through the original data frame to get a list of the hotspots that need tagging 
for(i in hotspot_locations){ 
    pickup_sub[[i]] = delivery_data[delivery_data$pickup_name == i, ] 
} 
#applies tags to the list pickup_sup 
sapply(pickup_sub, function(x){ 
    if(x$pickup_name == "Whole Foods Market"){ 
    x$pickup_name = paste(x$pickup_name, '-H1') 
    }else if(x$pickup_name == "Safeway"){ 
    x$pickup_name = paste(x$pickup_name, '-H2') 
    }else if(x$pickup_name == "Pizzeria Delfina"){ 
    x$pickup_name = paste(x$pickup_name, '-H3') 
    } 
}) 
#this code works, but isn't exactly what we want with this, we need to tag the original data frame 


#this is the first attempt to get just the indexes, but it's not returning just the indexes. should I use which() here? 
full_list = delivery_data[(delivery_data$pickup_name == "Whole Foods Market" | delivery_data$pickup_name == 'Safeway' | delivery_data$pickup_name == "Pizzeria Delfina") & delivery_data$pickup_zipcode == 94107,] 
# hs_zip is supposed to be a vector of indexes to help an apply function to tag the original data frame. 
hs_zip = delivery_data[which(delivery_data$pickup_zipcode == 94107),] 
# then iterate over the rows and attempt to tag. 
for(i in delivery_data[hs_zip,]){ 
    if(i$pickup_name == "Whole Foods Market"){ 
    i$pickup_name = paste(i$pickup_name, '-H1') 
    }else if(i$pickup_name == "Safeway"){ 
    i$pickup_name = paste(i$pickup_name, '-H2') 
    }else if(i$pickup_name == "Pizzeria Delfina"){ 
    i$pickup_name = paste(i$pickup_name, '-H3') 
    } 
} 

最終ループは、次のエラーが発生します。コピーではなく元のデータフレームにどのようにタグを付けることができますか? XJで

エラー[i]は:無効な添字タイプ 'リスト'

答えて

1

任意のループ実行のための必要はありません、単にifelse()を実行します。

delivery_data$pickup_name <- ifelse(delivery_data[pickup_zipcode == 94107 & 
            delivery_data$pickup_name == "Whole Foods Market", 
            paste0(delivery_data$pickup_name, "-H1"), 
            delivery_data$pickup_name) 

delivery_data$pickup_name <- ifelse(delivery_data[pickup_zipcode == 94107 & 
            delivery_data$pickup_name == "Safeway", 
            paste0(delivery_data$pickup_name, "-H2"), 
            delivery_data$pickup_name) 

delivery_data$pickup_name <- ifelse(delivery_data[pickup_zipcode == 94107 & 
            delivery_data$pickup_name == "Pizzeria Delfina", 
            paste0(delivery_data$pickup_name, "-H3"), 
            delivery_data$pickup_name) 

を代わりに、ネストされたifelse()使用:

delivery_data$pickup_name <- ifelse(delivery_data$pickup_zipcode == 94107, 
            ifelse(delivery_data$pickup_name == "Whole Foods Market", 
              paste0(delivery_data$pickup_name, "-H1"), 
                ifelse(delivery_data$pickup_name == "Safeway", 
                 paste0(delivery_data$pickup_name, "-H2"), 
                 ifelse(delivery_data$pickup_name == "Pizzeria Delfina", 
                   paste0(delivery_data$pickup_name, "-H3"), 
              delivery_data$pickup_name))), 
            delivery_data$pickup_name) 

さらに言葉を使用してwith()

delivery_data$pickup_name <- with(delivery_data, 
            ifelse(pickup_zipcode == 94107, 
             ifelse(pickup_name == "Whole Foods Market", 
               paste0(pickup_name, "-H1"), 
                 ifelse(pickup_name == "Safeway", 
                   paste0(pickup_name, "-H2"), 
                     ifelse(pickup_name == "Pizzeria Delfina", 
                      paste0(pickup_name, "-H3"), 
               pickup_name))), 
             pickup_name)) 
関連する問題