मुझे फिर से आपकी मदद चाहिए। path में प्रत्येक फ़ाइल को इंटियल डेटाफ़्रेम knime.in में मर्ज करने के बाद मैं केवल एक अंतिम डेटाफ़्रेम (संयुक्तडेटासेट) प्राप्त करने के लिए अपने कोड को कैसे अनुकूलित कर सकता हूँ। मुझे पता है lapply इस मामले में डेटाफ्रेम की एक सूची लौटाएगा लेकिन मैं apply ect के साथ सिंटैक्स को बदलने में सक्षम नहीं हूं। त्रुटियों के बिना। अगर मैं यह कोशिश करता हूं तो मुझे यह त्रुटि संदेश मिलता है: "match.fun (FUN): तर्क" FUN "कोई डिफ़ॉल्ट नहीं है"

library("dplyr")
library("stringr")

path ="C:/.../"
path2 ="C:/..."
files <- list.files(path, full.names=T)

knime.in <- read.csv(file=path2, header=TRUE, sep = ";")

dfList <- lapply(files, function(i) {
  df <- read.csv(i, header=TRUE, col.names=c("Column.0", "Column.1"), sep = ";",row.names=NULL)
  name =substr(i,sapply(str_locate_all(pattern = "/", i), tail, 1)[1]+1,nchar(i)-4)
  jointdataset <-merge(knime.in, df_2, by.x=name, by.y ='Column.0',all = TRUE)
  jointdataset <- jointdataset[ , ! names(jointdataset) %in% c(name)]
  names(jointdataset)[names(jointdataset)=="Column.1"] <- name
  print(name)
  return(jointdataset)
  })

आशा है कि आप इसमें फिर से मेरी मदद कर सकते हैं। शुक्रिया!!!

r
2
KTTRLD 16 फरवरी 2021, 17:44

2 जवाब

सबसे बढ़िया उत्तर

सबसे सरल उपाय केवल अंतिम परिणाम dfList <- dfList[[length(dfList)]] निकालना है। लेकिन एक बेहतर दृष्टिकोण lapply को for-loop से बदलना होगा

library("dplyr")
library("stringr")
library(data.table) # for setnames
path ="C:/.../"
path2 ="C:/..."
files <- list.files(path, full.names=T)

knime.in <- knime.out <- read.csv(file=path2, header=TRUE, sep = ";")

for(i in files){
  name <- substr(i,sapply(str_locate_all(pattern = "/", i), tail, 1)[1]+1,nchar(i)-4)
  knime.out <- read.csv(i, header=TRUE, col.names=c("Column.0", "Column.1"), sep = ";",row.names=NULL) %>% 
   full_join(knime.out, by.x = name, by.y = 'Column.0') %>%
   select(-!!sym(name)) %>% 
   setnames('Column.1', name, TRUE) #Change 'Column.1' to name and skip all other columns = TRUE

}

ध्यान दें कि मैं इसका परीक्षण नहीं कर सका क्योंकि आपका प्रश्न प्रतिलिपि प्रस्तुत करने योग्य नहीं है, इसलिए टाइपो या त्रुटियां हो सकती हैं। मैंने merge को full_join (all = TRUE) से बदल दिया है और मैं कॉलम का नाम बदलने के लिए data.table से setnames का उपयोग कर रहा हूं। -!!sym(name) को आपके name वेरिएबल को एक एनक्वॉटेड सिंबल में बदलना चाहिए, जो tidy-select फंक्शन के लिए जरूरी है।

इस तरह आप knime.in और knime.out के साथ समाप्त होंगे।

सावधान रहें!!
full_join, merge(..., all = TRUE) और इसी तरह के प्रयोग से विस्फोटक व्यवहार होता है, और आपको कम संख्या में प्रेक्षणों वाली फाइलों की छोटी संख्या के लिए भी स्मृति समस्याओं का अनुभव होने की संभावना है। अक्सर आपको विशेष रूप से मर्ज करने के लिए केवल left_join, right_join या inner_join की आवश्यकता होती है।

0
Oliver 16 फरवरी 2021, 18:12

@केटीटीआरएलडी

लागू करें के बजाय लागू करें का उपयोग करने का प्रयास करें। तो होगा:

dfList <- sapply(files, function(i) {
  df <- read.csv(i, header=TRUE, col.names=c("Column.0", "Column.1"), sep = ";",row.names=NULL)
  name =substr(i,sapply(str_locate_all(pattern = "/", i), tail, 1)[1]+1,nchar(i)-4)
  jointdataset <-merge(knime.in, df_2, by.x=name, by.y ='Column.0',all = TRUE)
  jointdataset <- jointdataset[ , ! names(jointdataset) %in% c(name)]
  names(jointdataset)[names(jointdataset)=="Column.1"] <- name
  print(name)
  return(jointdataset)
  })

अगर काम नहीं किया, तो data.frame lapply के आउटपुट को इस तरह से आजमाएं:

dfList <- data.frame(lapply(files, function(i) {
  df <- read.csv(i, header=TRUE, col.names=c("Column.0", "Column.1"), sep = ";",row.names=NULL)
  name =substr(i,sapply(str_locate_all(pattern = "/", i), tail, 1)[1]+1,nchar(i)-4)
  jointdataset <-merge(knime.in, df_2, by.x=name, by.y ='Column.0',all = TRUE)
  jointdataset <- jointdataset[ , ! names(jointdataset) %in% c(name)]
  names(jointdataset)[names(jointdataset)=="Column.1"] <- name
  print(name)
  return(jointdataset)
  }))
0
Urantia The Player 16 फरवरी 2021, 18:29