मुझे लगता है कि यह काफी आसान है, लेकिन मैं इसे अपने आप हल नहीं कर सकता।

मेरे पास dfs की निम्नलिखित सूची है:

df1 <- data.frame(col1=c(1,2,3), col2= c(4,3,6))
df2 <- data.frame(col1=c(5,2,7), col2= c(1,4,8))
df3 <- data.frame(col1=c(4,9,9), col2= c(7,6,4))
list.of.dfs <- list(df1,df2,df3)

अब, मैं dfs की मेरी सूची पर इसे if-else कमांड लागू करना चाहता हूं:

for (i in 1:length(list.of.dfs)) {
  if (list.of.dfs[[i]]$col2 >= 7) {
    list.of.dfs[[i]]$newcol <- "high"
  } else if (list.of.dfs[[i]]$col2 >= 5) {
    list.of.dfs[[i]]$newcol <- "medium"
  } else if (list.of.dfs[[i]]$col2 < 5) {
    list.of.dfs[[i]]$newcol <- "low"
  }
}

मैं अपनी सूची में अपने dfs की प्रत्येक पंक्ति के लिए एक नया कॉलम चाहता हूं जो मेरे if-else फ़ंक्शन से तीन अभिव्यक्तियों में से एक से भरा हो।

हालांकि, ऐसा लगता है कि मेरा कोड केवल प्रत्येक पुनरावृत्ति में पहली पंक्ति को मानता है:

> list.of.dfs[[1]]
  col1 col2 newcol
1    1    4    low
2    2    3    low
3    3    6    low
r
1
Sphenoidale 15 जिंदा 2022, 09:18

4 जवाब

एक तरीका tidyverse का उपयोग करना है। मैंने purrr::map के अंदर एक कस्टम फ़ंक्शन बनाया ताकि मैं सूची में प्रत्येक डेटाफ़्रेम पर पुनरावृति कर सकूं। मैंने newcol में नए मानों में मान निर्दिष्ट करने के लिए case_when का उपयोग किया।

library(tidyverse)

map(list.of.dfs, function(x)
  x %>%
    rowwise %>%
    mutate(newcol = case_when(
      col2 >= 7 ~ "high",
      between(col2, 5, 6) ~ "medium",
      col2 < 5 ~ "low"
    )))

आउटपुट

[[1]]
# A tibble: 3 × 3
# Rowwise: 
   col1  col2 newcol
  <dbl> <dbl> <chr> 
1     1     4 low   
2     2     3 low   
3     3     6 medium

[[2]]
# A tibble: 3 × 3
# Rowwise: 
   col1  col2 newcol
  <dbl> <dbl> <chr> 
1     5     1 low   
2     2     4 low   
3     7     8 high  

[[3]]
# A tibble: 3 × 3
# Rowwise: 
   col1  col2 newcol
  <dbl> <dbl> <chr> 
1     4     7 high  
2     9     6 medium
3     9     4 low   
1
Andrew Gillreath-Brown 15 जिंदा 2022, 10:25

Base R के साथ अपने दृष्टिकोण का पालन करके,

for(i in 1:length(list.of.dfs)) {
    x <- list.of.dfs[[i]]
    list.of.dfs[[i]][,"newcol"] <- ifelse(x[,"col2"]>=7,"high",
        ifelse(x[,"col2"]>=5,"medium","low")
    )
}

देता है,

[[1]]
  col1 col2 newcol
1    1    4    low
2    2    3    low
3    3    6 medium

[[2]]
  col1 col2 newcol
1    5    1    low
2    2    4    low
3    7    8   high

[[3]]
  col1 col2 newcol
1    4    7   high
2    9    6 medium
3    9    4    low
0
maydin 15 जिंदा 2022, 09:56

में, if (list.of.dfs[[i]]$col2 >= 7) { शर्त की लंबाई> 1 है और केवल पहले तत्व का उपयोग किया जाएगा, यानी, list.of.dfs[[i]] एक बूलियन वेक्टर देता है जैसे [1] FALSE FALSE TRUE जो इंगित करता है कि कोई विशिष्ट पंक्ति शर्त को संतुष्ट करती है या नहीं। तो R वेक्टर में पहला मान लेता है, (यहाँ यह FALSE है) और यदि स्थिति है तो अगले की जाँच करता है। अंत में col2 <5 के मामले में, शर्त संतुष्ट है और संबंधित मान (आपके कोड में "निम्न") को सभी पंक्तियों को list.of.dfs[[i]] में निर्दिष्ट करती है क्योंकि आप प्रत्येक पंक्ति को अलग से संबोधित नहीं कर रहे हैं।

आप दो फ़ंक्शन का उपयोग कर सकते हैं - एक col2 मान की जांच करने के लिए और दूसरा रैपर फ़ंक्शन डेटाफ़्रेम की सूची में पहला फ़ंक्शन लागू करने के लिए

rating <- function(r){
  if (r[2] >= 7){
    return("high")
  } else if (r[2] < 5){
    return("low")
  } else {
    return("medium")
  }
}

rate.df <- function(df){
  newcol <- apply(df, 1, rating)
  cbind(df, newcol=newcol)
}

list.of.dfs <- lapply(list.of.dfs, rate.df)

यह एक आउटपुट उत्पन्न करता है:

[[1]]
  col1 col2 newcol
1    1    4    low
2    2    3    low
3    3    6 medium

[[2]]
  col1 col2 newcol
1    5    1    low
2    2    4    low
3    7    8   high

[[3]]
  col1 col2 newcol
1    4    7   high
2    9    6 medium
3    9    4    low
0
arjunsiva 15 जिंदा 2022, 10:18

हम cut का उपयोग कर सकते हैं और फिर प्रत्येक सूची तत्व पर purrr पैकेज से map के साथ पुनरावृति कर सकते हैं:

library(dplyr)
library(purrr)

list.of.dfs %>% 
  map(~ mutate(., newcol = cut(col2, breaks = c(0, 4, 6, Inf),
                               labels = c("low", "medium", "high")
                               )))
[[1]]
  col1 col2 newcol
1    1    4    low
2    2    3    low
3    3    6 medium

[[2]]
  col1 col2 newcol
1    5    1    low
2    2    4    low
3    7    8   high

[[3]]
  col1 col2 newcol
1    4    7   high
2    9    6 medium
3    9    4    low
0
TarJae 15 जिंदा 2022, 10:54