【问题标题】:Apply function on data and get vector/df output in R?对数据应用函数并在 R 中获取向量/df 输出?
【发布时间】:2018-04-14 00:38:02
【问题描述】:

我有以下日期:

var1 <- c("a", "b", "c", "d", "e")

我有一个函数可以为每个 var1 值分配一个数字分数 (0-3)。

    f(a) --> 2
    f(b) --> 1 

etc...

我想使用 apply like 函数来获取包含 2 列的数据框: var1 和分数:

var1  score
a     1
b     0
c     3
d     3
e     2
f     1

我曾尝试使用 vapply 和 map_dfr,但它不像我展示的那样工作。 请告知如何执行此操作。

附言

For map_dfr: Error: cannot convert object to a data frame

【问题讨论】:

  • 你可以使用stack,即stack(setNames(lapply(var1, f), var1))[2:1]
  • 先设置向量var1为数据框:df1 &lt;- as.data.frame(var1),然后sapply(df1, function)
  • 你能复制粘贴你的数据框(或其中的一部分)和你的函数吗?
  • 我不能使用 map/apply 或任何其他类似功能的功能在一行代码中完成它?
  • @akrun 将立即执行并更新。

标签: r function dictionary dataframe apply


【解决方案1】:

借助 akrun 的解决方案,这更简单

f <- function(x) sample(0:3, 1)
var1 <- c("a", "b", "c", "d", "e")

data.frame(cbind(Var1 = var1, Score = lapply(var1,f)))

  Var1 Score
1    a     0
2    b     2
3    c     0
4    d     1
5    e     3

【讨论】:

    【解决方案2】:

    我们可以循环遍历vector ('var1') 应用函数 (f) 以获得vectorlist,使用'var1' 设置vector 的名称并使用stack 将其转换为 2 列 data.frame

    stack(setNames(lapply(var1, f), var1))[2:1]
    

    默认情况下,stack 将列名返回为“ind”和“values”。我们可以将其更改为 'var1' 和 'score'

    setNames(stack(setNames(lapply(var1, f), var1))[2:1], c('var1', 'score'))
    

    数据

    f <- function(x) sample(0:3, 1)
    var1 <- c("a", "b", "c", "d", "e")
    

    【讨论】:

    • @akrun,你能看看我的回答吗?
    • 谢谢@Hardikgupta
    【解决方案3】:

    将您的向量转换为data.frame,然后使用 sapply 创建新向量。

    df1 <- as.data.frame(var1)
    df1$test <- sapply(df1$var1, function(x) if (x=="a") 1 else 0) 
    
    
      var1 test
    1    a    1
    2    b    0
    3    c    0
    4    d    0
    5    e    0
    
     str(df1)
    'data.frame':   5 obs. of  2 variables:
     $ var1: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
     $ test: num  1 0 0 0 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多