【问题标题】:apply function to each column of a data frame using a value from another data frame使用来自另一个数据帧的值将函数应用于数据帧的每一列
【发布时间】:2013-06-13 02:13:15
【问题描述】:

我有一个数据框,其中包含一组变量的观察结果:

mydata <-  data.frame(Sample = c("A", "B", "C", "D"), 
  V1 = c(25, 27, 18, 29),
  V2 = c(32, 45, 28, 30),
  V3 = c(16, 32, 29, 22),
  V4 = c(27, 29, 28, 32))

我需要根据一个变量特定的常量E来转换每一列的数据,我已经将它存储在另一个数据框中:

e <- data.frame(Var = c("V1", "V3", "V2", "V4"), E = c(2, 1.4, 1.7, 1.8))

我想要一个新数据框,其中包含 mydata 中数据的转换值,该值基于 e 中每个变量的正确常量,其中新值为

=1/E^(value in mydata)

我知道如何使用lapply循环遍历mydata中的每一列,我只是不知道如何指定每一列的E值需要来自e,基于变量姓名。 (e 中的值与mydata 中的列的顺序不同,并且在某些情况下,e 中会有未使用的行,即 E 的值表示 mydata 中不存在的变量。

如何根据变量名和不同数据框中的 E 对应值,对一个数据框的每一列应用我的数据转换?

【问题讨论】:

    标签: r dataframe lapply


    【解决方案1】:

    这就是我的处理方式。我不会遍历列,而是遍历列名:

    sapply(colnames(mydata)[-1], function(x) 1/(e$E[e$Var == x]^mydata[,x]))
    
    #                V1           V2           V3           V4
    # [1,] 2.980232e-08 4.223131e-08 4.591467e-03 1.281275e-07
    # [2,] 7.450581e-09 4.263817e-11 2.108157e-05 3.954553e-08
    # [3,] 3.814697e-06 3.527201e-07 5.784782e-05 7.118195e-08
    # [4,] 1.862645e-09 1.220485e-07 6.097941e-04 6.780783e-09
    

    如果您正在寻找其他东西,请告诉我。

    【讨论】:

    • +1 - 对此的一种变体是为e 使用命名向量,例如:e &lt;- setNames(e$E,e$Var),然后使用data.frame(lapply(names(mydata[-1]),function(x) 1/e[x]^mydata[x] )) 这将避免e$E[e$Var... 的双重索引
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2020-10-12
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多