![](/img/trans.png)
[英]How to loop through the columns in an R data frame and create a new data frame using the column name in each iteration?
[英]How to create new data frame with custom columns out of another data frame, on filtered data per each column
我試圖尋找類似的問題,但找不到類似的問題。
我有一個具有數百行和幾個變量的數據框df。 第一個變量是級別 ,從1到8。
例如:
df<- data.frame(level = c(1,1,1,2,2,3,4,5,6,7,8), CODE = c("1234", "3452", "1234", "7654","6547","6546", "7683", "6543", "7683", "6543", "7683"), ADD_ALLOW_MEAL = c(NA, "Y", "Y", "N", "N", NA, NA, "Y", "Y", "N", 'N'), ALLOW_MEALLOW = c(NA, 40, 60, NA, NA, NA, NA, 50, 70, NA, NA))
> df
level CODE ADD_ALLOW_MEAL ALLOW_MEALLOW
1 1 1234 <NA> NA
2 1 3452 Y 40
3 1 1234 Y 60
4 2 7654 N NA
5 2 6547 N NA
6 3 6546 <NA> NA
7 4 7683 <NA> NA
8 5 6543 Y 50
9 6 7683 Y 70
10 7 6543 N NA
11 8 7683 N NA
我需要創建一個僅包含8行(來自df的8個級別)的新數據框。 通常我會使用簡單的方法:
df %>%
group_by(level) %>%
summarise()
問題是我需要在過濾后的數據上針對每個級別創建幾個非常自定義的列。
例:
df %>%
group_by(level) %>%
summarise(
Meal_Average = filter(., ADD_ALLOW_MEAL =="Y" & ALLOW_MEALLOW>0) %>% {ifelse(str_detect(.$CODE, "2")=="TRUE", round(mean(.$ALLOW_MEALLOW, na.rm = TRUE),3), NA_real_ )}
)
我收到以下錯誤:
Column `Meal_Average` must be length 1 (a summary value), not 4
我想要的結果是:
level Meal_Average
1 1 50
2 2 NA
3 3 NA
4 4 NA
5 5 NA
6 6 NA
7 7 NA
8 8 NA
有什么想法我該怎么做?
謝謝!!
這是使用dplyr
的想法。 我在這里所做的是,我只是使用您的條件將ALLOW_MEALLOW
值替換為0(以便不影響均值),即
library(dplyr)
df %>%
mutate(ALLOW_MEALLOW = replace(ALLOW_MEALLOW, ADD_ALLOW_MEAL == 'N' & ALLOW_MEALLOW < 0 | !grepl('2', CODE), 0)) %>%
group_by(level) %>%
summarise(new_mean = mean(ALLOW_MEALLOW, na.rm = TRUE))
這使,
# A tibble: 8 x 2 level new_mean <dbl> <dbl> 1 1 50 2 2 0 3 3 0 4 4 0 5 5 0 6 6 0 7 7 0 8 8 0
注意:您可以照常用NA替換0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.