簡體   English   中英

帶有兩個不固定參數的 R lapply 函數

[英]R lapply function with two arguments that are not fixed

我發現之前問過一個類似的問題 我的問題比上一個復雜一點。 對於我的問題,y 參數不是固定的。

在函數(X,Y){SOME FUNCTION} 中,X 是字符列表,Y 是數據框列表。 基本上,我希望函數分別按順序處理一對 X 和 Y,並將輸出作為一個列表生成。 例如,X列表的第一個元素和Y列表的第一個元素,X列表的第二個元素和Y列表的第二個元素,X列表的第三個元素和Y列表的第三個元素,...

X, Y 的例子

X <- c("1", "2")
y1 <- data.frame("person.1" = "Amy", "bestfood..1" = "fish", "bestthing..1" = "book",
                 "person.2" = "Mike", "bestfood..2" = "fish", "bestthing..2" = "book")
y2 <- data.frame("person.1" = "Amy","bestfood..1" = "carrot", "bestthing..1" = "cloth",
                 "person.2" = "Mike","bestfood..2" = "carrot", "bestthing..2" = "cloth")
Y <- list(y1,y2)

功能:

  addID <- function(X, Y) {
     rowlength <- length(Y)
     df <- as.data.frame(matrix(NA, nrow = rowlength, ncol = 3))
     colnames(df) <- c("ID", "Person", "Food")
     df[1:nrow(df), 1] <- X

  # name
  namecols <-grep("person",colnames(Y))
  for (i in 1:length(namecols)) {
    name <- Y[1, namecols[i]]
    df[i, 2] <- as.character(name)
  }
  # food
  foodcols <-
  grep("bestfood",colnames(Y))
  for (i in 1:length(foodcols)) {
    food <- Y[1, foodcols[i]]
    df[i, 3] <- as.character(foodcols)
  }

  return(df)
   }
  }

我嘗試使用 lapply 但無法找出包含 X 列表的方法。 當我嘗試這個時:

lapply(Y, function, X=X)

該功能無法正常工作。 我想知道是否還有其他方法可以將 X 包含在其中(我在單個字符和數據幀上嘗試了該功能,效果很好。)

我希望這很清楚。 如果沒有,請指出,我會盡力澄清。 提前致謝。


更新:

我按照評論的建議嘗試了 Map 。 它返回:不正確的維數。 我在函數中添加了一些細節。 似乎 R 卡在最后一行。

outcome <- Map(addID, Y, X)

我得到

error in Y[1, namecols[i]] : incorrect number of dimensions
In addition: Warning message:
In `[<-.data.frame`(`*tmp*`, 1:nrow(df), 1, value = list(person.1 = 1L,  :
 provided 6 variables to replace 1 variables

結果應該如下所示:

z1 <- data.frame(ID = c(1,2), Person = c("Amy","Mike"), Food = c("fish", "fish"))
z2 <- data.frame(ID = c(1,2), Person = c("Amy","Mike"), Food = c("carrot", "carrot"))
outcome <- list(z1,z2)

我們可以在tidyverse輕松做到這tidyverse

library(dplyr)
library(tidyr)
bind_rows(Y, .id = 'ID') %>% 
    select(ID, starts_with('person'),  contains('food')) %>% 
    pivot_longer(cols = -ID, names_to = c(".value"),
       names_pattern = "([^.]+)\\.+\\d+")

-輸出

# A tibble: 4 x 3
  ID    person bestfood
  <chr> <chr>  <chr>   
1 1     Amy    fish    
2 1     Mike   fish    
3 2     Amy    carrot  
4 2     Mike   carrot  

有了OP的功能,我們修改一下就可以了

addID <- function(X, Y) {
     rowlength <- length(Y)
     df <- as.data.frame(matrix(NA, nrow = rowlength, ncol = 3))
     colnames(df) <- c("ID", "Person", "Food")
     df[1:nrow(df), 1] <- X
     namecols  <- grep("person",colnames(Y))
     df[, 2] <- unlist(Y[namecols])
     foodcols <- grep("bestfood", colnames(Y))
     df[,3] <- unlist(Y[foodcols])
     

  

  return(unique(df))
   }

-測試

Map(addID, X, Y)
$`1`
  ID Person Food
1  1    Amy fish
2  1   Mike fish

$`2`
  ID Person   Food
1  2    Amy carrot
2  2   Mike carrot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM