2017-08-24 35 views
5

मेरे पास विभिन्न चर के साथ डेटा फ्रेम का एक गुच्छा है। मैं उन्हें आर में पढ़ना चाहता हूं और उन लोगों को कॉलम जोड़ना चाहता हूं जो कुछ चर से कम हैं ताकि उनके पास मानक वैरिएबल का एक सामान्य सेट हो, भले ही कुछ अखंड हों।कॉलम जोड़ना अगर यह मौजूद नहीं है

दूसरे शब्दों में ... क्या कॉलम मौजूद नहीं होने पर NA के कॉलम जोड़ने के लिए कोई तरीका है? मेरा वर्तमान प्रयास नए चर जोड़ने के लिए काम करता है जहां कॉलम मौजूद नहीं है (top_speed) लेकिन कॉलम पहले से मौजूद होने पर विफल रहता है (mpg) (यह सभी मानों को पहले मान, Mazda RX4 पर सेट करता है)।

library(tidyverse) 
mtcars %>% 
    tbl_df() %>% 
    rownames_to_column("car") %>% 
    mutate(top_speed = ifelse("top_speed" %in% names(.), top_speed, NA), 
     mpg = ifelse("mpg" %in% names(.), mpg, NA)) %>% 
    select(car, top_speed, mpg, everything()) 

# # A tibble: 32 x 13 
#     car top_speed mpg cyl disp hp drat wt qsec vs am gear carb 
#    <chr>  <lgl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
# 1   Mazda RX4  NA 21  6 160.0 110 3.90 2.620 16.46  0  1  4  4 
# 2  Mazda RX4 Wag  NA 21  6 160.0 110 3.90 2.875 17.02  0  1  4  4 
# 3  Datsun 710  NA 21  4 108.0 93 3.85 2.320 18.61  1  1  4  1 
# 4 Hornet 4 Drive  NA 21  6 258.0 110 3.08 3.215 19.44  1  0  3  1 
# 5 Hornet Sportabout  NA 21  8 360.0 175 3.15 3.440 17.02  0  0  3  2 
# 6   Valiant  NA 21  6 225.0 105 2.76 3.460 20.22  1  0  3  1 
# 7  Duster 360  NA 21  8 360.0 245 3.21 3.570 15.84  0  0  3  4 
# 8   Merc 240D  NA 21  4 146.7 62 3.69 3.190 20.00  1  0  4  2 
# 9   Merc 230  NA 21  4 140.8 95 3.92 3.150 22.90  1  0  4  2 
# 10   Merc 280  NA 21  6 167.6 123 3.92 3.440 18.30  1  0  4  4 

उत्तर

3

हम स्तंभ

fncols <- function(data, cname) { 
    add <-cname[!cname%in%names(data)] 

    if(length(add)!=0) data[add] <- NA 
    data 
} 
fncols(mtcars, "mpg") 
fncols(mtcars, c("topspeed","nhj","mpg")) 
+1

बहुत धन्यवाद ... ... मैं एक श्रृंखला में इसका इस्तेमाल करने के लिए कई के साथ (~ 15) चर ... 'mtcars%>% fncols जा रहा हूँ यह अब तक जवाब से बाहर सबसे तेजी से काम करता है लगता है ("एमपीजी")%>% fncols ("top_speed") ' – gjabel

+1

एक श्रृंखला में इसका उपयोग करने के बजाय, संपादित संस्करण – Onyambu

+0

@ ओनंबू को संपादित करने के लिए धन्यवाद। यह अधिक सामान्य है – akrun

1

बनाने के लिए एक सहायक समारोह बना सकते हैं आप rowwise समारोह इस तरह उपयोग कर सकते हैं:

library(tidyverse) 
mtcars %>% 
    tbl_df() %>% 
    rownames_to_column("car") %>% 
    rowwise() %>% 
    mutate(top_speed = ifelse("top_speed" %in% names(.), top_speed, NA), 
     mpg = ifelse("mpg" %in% names(.), mpg, NA)) %>% 
    select(car, top_speed, mpg, everything()) 
0

आप नए data.frame के स्तंभों बाध्य कर सकते हैं एनए से भरे नकली पूर्ण डेटा। फ्रेम के साथ, डुप्लीकेट कॉलम का नाम बदलें, और उसके बाद केवल मूल नाम फ़िल्टर करें।

# your default complete vector of col names 
standard.variables = names(mtcars) 
# prep 
default=mtcars %>% mutate_all(.funs=function(x) NA) 
# treat with a data.frame missing 3 columns 
test=mtcars %>% select(-mpg, -disp, -am) 
bind_cols(test, default) %>% setNames(make.names(names(.), unique=TRUE)) %>% 
    select_(.dots=standard.variables) %>% head(2) 
#### mpg cyl disp hp drat wt qsec vs am gear carb 
#### 1 NA 6 NA 110 3.9 2.620 16.46 0 NA 4 4 
#### 2 NA 6 NA 110 3.9 2.875 17.02 0 NA 4 4 
1

निम्नलिखित का प्रयास करें,

library(tidyverse) 

mtcars %>% 
    tbl_df() %>% 
    rownames_to_column("car") %>% 
    mutate(top_speed = if ("top_speed" %in% names(.)){return(top_speed)}else{return(NA)}, 
     mpg = if ("mpg" %in% names(.)){return(mpg)}else{return(NA)}) %>% 
    select(car, top_speed, mpg, everything()) 
# A tibble: 32 x 13 
       car top_speed mpg cyl disp hp drat wt qsec vs am gear carb 
       <chr>  <lgl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1   Mazda RX4  NA 21.0  6 160.0 110 3.90 2.620 16.46  0  1  4  4 
2  Mazda RX4 Wag  NA 21.0  6 160.0 110 3.90 2.875 17.02  0  1  4  4 
3  Datsun 710  NA 22.8  4 108.0 93 3.85 2.320 18.61  1  1  4  1 
4 Hornet 4 Drive  NA 21.4  6 258.0 110 3.08 3.215 19.44  1  0  3  1 
5 Hornet Sportabout  NA 18.7  8 360.0 175 3.15 3.440 17.02  0  0  3  2 
6   Valiant  NA 18.1  6 225.0 105 2.76 3.460 20.22  1  0  3  1 
7  Duster 360  NA 14.3  8 360.0 245 3.21 3.570 15.84  0  0  3  4 
8   Merc 240D  NA 24.4  4 146.7 62 3.69 3.190 20.00  1  0  4  2 
9   Merc 230  NA 22.8  4 140.8 95 3.92 3.150 22.90  1  0  4  2 
10   Merc 280  NA 19.2  6 167.6 123 3.92 3.440 18.30  1  0  4  4 
# ... with 22 more rows 

मुझे लगता है कि ifelse() वस्तु से वर्ग के वारिस नहीं है।

2

यदि आपके पास एक खाली डेटाफ्रेम था जिसमें सभी नामों की जांच करने के लिए नाम हैं, तो आप कॉलम जोड़ने के लिए bind_rows का उपयोग कर सकते हैं।

मैंने उचित कॉलम नामों के साथ खाली tibble खाली करने के लिए purrr:map_dfr का उपयोग किया।

columns = c("top_speed", "mpg") %>% 
    map_dfr(~tibble(!!.x := logical())) 

# A tibble: 0 x 2 
# ... with 2 variables: top_speed <lgl>, mpg <lgl> 

bind_rows(columns, mtcars) 

# A tibble: 32 x 12 
    top_speed mpg cyl disp hp drat wt qsec vs am gear carb 
     <lgl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  NA 21.0  6 160.0 110 3.90 2.620 16.46  0  1  4  4 
2  NA 21.0  6 160.0 110 3.90 2.875 17.02  0  1  4  4 
3  NA 22.8  4 108.0 93 3.85 2.320 18.61  1  1  4  1 
संबंधित मुद्दे