使用lapply

时间:2018-05-21 17:24:31

标签: r function lapply

首先 - 我为这个措辞严厉的问题道歉,如果你有任何更合适的建议,我全都耳朵!

我编写了一个函数,根据调用的对象在我的df中添加一个新变量。例如,我有x_data,当我将它放入我的函数时,会创建一个名为x_or_y的新变量,所有条目都显示为" x"。你猜对了 - 还有一个y_data,当插入到函数中时,它会创建相同的变量x_or_y,并用" y"

填充它

我遇到了一些问题但是当我有一个dfs(x_datay_data)列表并且我使用lapply()到列表时 - 它只返回相同的字母对全部。见下面我的例子。

实施例

set.seed(123)
x_data <- data.frame(A = rnorm(20),
                 B = rnorm(20))
y_data <- data.frame(A = rnorm(20),
                 B = rnorm(20))

&#34; x或y&#34;:

的功能
add_x_or_y  <- function(z) {
  z$x_or_y <- ifelse(grepl(pattern = "x", 
                                 deparse(substitute(z)), fixed = TRUE), 
                           "x", "y")
  z
}

因此单独尝试该功能:

head(add_x_or_y(x_data),3)

            A          B x_or_y
1 -0.56047565 -1.0678237      x
2 -0.23017749 -0.2179749      x
3  1.5587083 -1.0260044       x

head(add_x_or_y(y_data),3)

           A          B x_or_y
1 -0.6947070  0.3796395      y
2 -0.2079173 -0.5023235      y
3 -1.2653964 -0.3332074      y

好的,这样才有用 - 但在现实生活中,我需要通过该功能提供大约20种不同的dfs。每次都会浪费很多浪费的空间,所以让我们制作一个列表并使用lapply()

x_y_list <- list(x_data = x_data,
                 y_data = y_data)
x_y_list <- lapply(x_y_list, add_x_or_y)

head(x_y_list$x_data,3)
           A          B x_or_y
1 -0.5604756 -1.0678237      y
2 -0.2301775 -0.2179749      y
3  1.5587083 -1.0260044      y

head(x_y_list$y_data,3)
           A          B x_or_y
1 -0.6947070  0.3796395      y
2 -0.2079173 -0.5023235      y
3 -1.2653964 -0.3332074      y

它没有用! :(第一个应该在x_or_y变量中有&#34; x&#34;&#39;在这里我确定它是一个非常简单的解决方案,但我似乎无法忍受找到它 - 请帮助Stack Overflow!

1 个答案:

答案 0 :(得分:1)

如果您正在使用lapply,那么您只是在没有其名称的情况下移交数据框。也许如果你改变方法:

set.seed(123)
x_data <- data.frame(A = rnorm(20),
                     B = rnorm(20))
y_data <- data.frame(A = rnorm(20),
                     B = rnorm(20))

add_x_or_y <- function(df, df_name) {
  df$x_or_y <- ifelse(grepl("x", df_name) == TRUE, "x", "y")
  df
}

x_y_list <- list(x_data = x_data,
                 y_data = y_data)

x_y_list <- mapply(add_x_or_y, 
                   x_y_list, 
                   names(x_y_list), SIMPLIFY = FALSE)

head(x_y_list$x_data, 3)
head(x_y_list$y_data, 3)