R:将函数应用于数据帧的每个元素

时间:2016-10-12 09:37:31

标签: r function

例如,让我们使用由字符串组成的以下数据框:

df <- data.frame(X = LETTERS[1:3], Y = LETTERS[4:6], row.names = c("r1", "r2", "r3"), stringsAsFactors = F)

> df
   X Y
r1 A D
r2 B E
r3 C F

现在,我想将此函数应用于数据帧的每个元素:

my_f <- function(x) paste0(x, x)

哪个应该产生这个结果:

>df
    X  Y
r1 AA DD
r2 BB EE
r3 CC FF

我一直在使用嵌套for循环:

for (i in 1:dim(df)[1]) {
    for (j in 1:dim(df)[2]) {
        df[i, j] = my_f(df[i, j])
    }
}

我想知道是否有更短/更快的方法来实现相同的结果?请注意,输出必须是具有相同行的数据帧。和colums&#39;名。

4 个答案:

答案 0 :(得分:5)

我们可以通过使用import java.util.Calendar; import java.util.GregorianCalendar; public class MainActivity { private Calendar calendar; public MainActivity() { this.calendar = new GregorianCalendar(); } public Calendar getToday() { return calendar; } } public class Main { public static void main(String[] args) { Calendar calendar = (Calendar) new MainActivity().getToday().clone(); calendar.set(Calendar.HOUR_OF_DAY, 2); //set some dummy values calendar.set(Calendar.MINUTE, 2); calendar.set(Calendar.SECOND, 0); if (calendar.getTimeInMillis() <= System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 7); } } } 循环数据集的列来使用strreplapply将恢复相同的“数据框架”。结构

[]

答案 1 :(得分:4)

这是一个没有任何apply-function的解决方案:

df[] <- my_f(as.matrix(df))

答案 2 :(得分:2)

你已经有了答案。

您可以apply对每个元素进行行my_f <{1}}

margin = 1

正如@ m0h3n建议的那样,你可以通过逐列应用函数来避免data.frame(t(apply(df, 1,my_f))) # X1 X2 #r1 AA DD #r2 BB EE #r3 CC FF ranspose步骤(t

margin=2

答案 3 :(得分:1)

使用for循环

for(i in 1:nrow(df)){
  df$X[i] <- paste0(df$X[i],df$X[i],collapse = "")
  df$Y[i] <- paste0(df$Y[i],df$Y[i],collapse = "")
}

print(df)

  X  Y
r1 AA DD
r2 BB EE
r3 CC FF