我有一套,W <- c("a","b","c")
還有一個資料框
df <- data.frame(col1 = c(1,2,3), col2 = c("a","b","c"), col3 =c("t","b","p"))
我想%in%在多個列上運行運算子以回傳第TRUE/FALSE2 列和第 3 列。我希望第 1 列保持不變。
我知道我能做到
>df$col1 <- df$col1 %in% W
和
>df$col2 <- df$col2 %in% W
我不確定如何在一行中做到這一點。我對 R 和編程也很陌生。
uj5u.com熱心網友回復:
您可以跨兩列應用函式:
library(tidyverse)
W <- c("a","b","c")
df <- tibble(col1 = c(1,2,3), col2 = c("a","b","c"), col3 =c("t","b","p"))
df |>
mutate(across(c(col2, col3), \(x) x %in% W))
#> # A tibble: 3 x 3
#> col1 col2 col3
#> <dbl> <lgl> <lgl>
#> 1 1 TRUE FALSE
#> 2 2 TRUE TRUE
#> 3 3 TRUE FALSE
uj5u.com熱心網友回復:
你可以試試:
df[,2:3] <- apply(df[,2:3], 2, function(x) x %in% W)
# col1 col2 col3
#1 1 TRUE FALSE
#2 2 TRUE TRUE
#3 3 TRUE FALSE
將2在apply應用跨列功能(1將跨行收費)。df[,2:3] 僅標識第二列和第三列(也可以這樣做df[,-1])。
uj5u.com熱心網友回復:
lapply 專為對資料幀進行此類操作而設計。
apply 實際上是為矩陣設計的,在資料??幀上運行緩慢。
該%in%運營商實際上是函式`%in%`()(TRY help(`%in%`)),因此我們可以在使用它的名字lapply,并不需要一個匿名函式(那些function(x) ...)。
df[2:3] <- lapply(df[2:3], `%in%`, W)
df
# col1 col2 col3
# 1 1 TRUE FALSE
# 2 2 TRUE TRUE
# 3 3 TRUE FALSE
uj5u.com熱心網友回復:
以下是給定解決方案的變體:
library(dplyr)
df %>%
mutate(across(-col1, ~. %in% W))
col1 col2 col3
1 1 TRUE FALSE
2 2 TRUE TRUE
3 3 TRUE FALSE
uj5u.com熱心網友回復:
嘗試 as.matrix
> df[-1] <- as.matrix(df[-1]) %in% W
> df
col1 col2 col3
1 1 TRUE FALSE
2 2 TRUE TRUE
3 3 TRUE FALSE
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397798.html
標籤:r
