/ / Ефективно трансформиране на множество колони в кадър с данни - r

Ефективно трансформиране на няколко колони на рамка за данни - r

Имам рамка с данни и искам да трансформирам всичкиколони (да кажем, да вземете дневниците или каквото и да било) с колони, които съответстват на определено име. Така че в примера по-долу искам да вземем дневника на X.1 и X.2, но не Y или Z.1.

df <- data.frame(
Y = sample(0:1, 10, replace = TRUE),
X.1 = sample(1:10),
X.2 = sample(1:10),
Z.1 = sample(151:160)
)

# option 1, won"t work for dozens of fields
df$X.1 <- log(df$X.1)
df$X.2 <- log(df$X.2)

Има ли добър, ефективен начин да направите това, когато dataframe е няколко gigabtyes?

Отговори:

20 за отговор № 1

В случай на функции, които ще върнат data.frame:

cols <- c("X.1","X.2")
df[cols] <- log(df[cols])

В противен случай ще трябва да използвате lapply или линия над колоните. Тези решения ще бъдат по-бавни от решението по-горе, така че ги използвайте само ако трябва.

df[cols] <- lapply(df[cols], function(x) c(NA,diff(x)))
for(col in cols) {
df[col] <- c(NA,diff(df[col]))
}

6 за отговор № 2
vars <- c("X.1", "X.2")

df[vars] <- lapply(df[vars], log)

1 за отговор № 3
df <- data.frame(
Y = sample(0:1, 10, replace = TRUE),
X.1 = sample(1:10),
X.2 = sample(1:10),
Z.1 = sample(151:160)
)
df

ако приемем, че знаете тези променливи, които изискват преобразувания в реалния информационен кадър (2 и 3 се отнасят до 2-ра и 3-та променливи в df, които са X.1 и X.2)

df2=log10(df[c(2:3)])
df2

ако променливите са далеч част от кадъра, можете да ги изберете като c (1,3,6,8: 10,13) за 1-ви, 3-ти, 6-ти, 8-ми и 10-ти.