r use apply用于更新数据框

时间:2015-12-22 16:30:50

标签: r dataframe lapply

我有以下数据框' adjustedShiftLengths':

                          PositionCDF Avg_shift_len Avg_shift_median  Adjusted_avg_shift_len
1          Emergency Medicine - Nurse             6                6       0                      
2                               Nurse             6                6       0               
3              Nurse - Intensive Care             6                6       0 

我想更新' Adjusted_avg_shift_len'通过应用函数在每个行的数据框中。基本上是在" Adjusted_avg_shift_len'中更新的新值。应该让我们说调用另一个函数的结果getAdjustedShiftLengths(Avg_shift_len)

这是我到目前为止所做的:

updateAdjustedValues <- function (valueToBeRounded, row) {
  adjustedShiftLengths$Adjusted_avg_shift_len[row] <- adjustShiftLength(valueToBeRounded)
}

我不确定如何传入&#39;行&#39; apply函数的值(即函数updateAdjustedValues的参数)

> apply(adjustedShiftLengths, 1, updateAdjustedValues(adjustedShiftLengths$Avg_shift_len,row ))

1 个答案:

答案 0 :(得分:1)

您没有将row参数传递给apply;相反,apply将传递一行作为它正在调用的函数的第一个参数。

您的代码应如下所示:

adjustedShiftLengths['Adjusted_avg_shift_len'] <- apply(adjustedShiftLengths, 1, updateAdjustedValues)

但是你需要调整你的函数updateAdjustedValues

updateAdjustedValues <- function (row) {
    getAdjustedShiftLengths(row['Avg_shift_len'])
}

另一种方法是使用transform,我认为这更适合您的情况。

transform(adjustedShiftLengths, Adjusted_avg_shift_len=getAdjustedShiftLengths(Avg_shift_len))

使用transform时,您可以直接按名称访问列,即您位于数据框的范围内。因此,使用transform的一种可能方式是

df <- transform(df, ExistingColumn1 = ExistingColumn1 ^ 2, ExistingColumn2 = someFunction(ExistingColumn2), NewColumn = ExistingColumn1 + ExistingColumn2)

实施例

sq <- function(x) x^2
df <- iris
df <- transform(iris, Sepal.Length = Sepal.Length * 1000, Sepal.Width = sq(Sepal.Width), Sepal.Weirdo = Sepal.Length + Sepal.Width)

在此示例中,将创建名为Sepal.Weirdo的新变量(列),但其值将根据现有的Sepal.LengthSepal.Width值,而不是transform之后的值{1}} df

注意:如果您拥有大型数据集,则可以考虑使用data.table