例如,让我们使用由字符串组成的以下数据框:
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;名。
答案 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);
}
}
}
循环数据集的列来使用strrep
。 lapply
将恢复相同的“数据框架”。结构
[]
答案 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