我的資料框如下所示:
x s1 s2 s3 s4
1 x1 1 1954 1 yes
2 x2 2 1955 1 no
3 x3 1 1976 2 yes
4 x4 2 1954 2 yes
5 x5 3 1943 1 no
樣本資料:
df <- data.frame(x=c('x1','x2','x3','x4','x5'),
s1=c(1,2,1,2,3),
s2=c(1954,1955,1976,1954,1943),
s3=c(1,1,2,2,1),
s4=c('yes','no','yes','yes','no'))```
是否可以將包含整數的資料框列提取1到3?例如,新的資料框看起來像:
newdf
x s1 s3
1 x1 1 1
2 x2 2 1
3 x3 1 2
4 x4 2 2
5 x5 3 1
是否可以根據列中的值是否為 1將s1和s3列更改為 0 或 1?更改后的資料框將如下所示:
newdf2
x s1 s3
1 x1 1 1
2 x2 0 1
3 x3 1 0
4 x4 0 0
5 x5 0 1
uj5u.com熱心網友回復:
我認為這就是你所期望的:
my_df <- data.frame(x=c('x1','x2','x3','x4','x5'),
s1=c(1,2,1,2,3),
s2=c(1954,1955,1976,1954,1943),
s3=c(1,1,2,2,1),
s4=c('yes','no','yes','yes','no'))
my_df$end <- apply(my_df, 2, function(x) paste(x, collapse = " "))
my_df <- my_df %>% group_by(x) %>% mutate(end2 = paste(str_extract_all(string = end, pattern = "1|2|3", simplify = TRUE), collapse = " "))
my_var <- which(my_df$end == my_df$end2)
my_df[, my_var] <- t(apply(my_df[, my_var], 1, function(x) ifelse(test = x == 1, yes = 1, no = 0)))
my_df <- my_df[, c(1, my_var)]
uj5u.com熱心網友回復:
基數R
newdf <- df[, unique(c("x", names(which(sapply(df, function(z) is.numeric(z) & any(c(1, 3) %in% z)))))), drop = FALSE]
newdf
# x s1 s3
# 1 x1 1 1
# 2 x2 2 1
# 3 x3 1 2
# 4 x4 2 2
# 5 x5 3 1
newdf[-1] <- lapply(newdf[-1], function(z) (z == 1))
newdf
# x s1 s3
# 1 x1 1 1
# 2 x2 0 1
# 3 x3 1 0
# 4 x4 0 0
# 5 x5 0 1
演練:
首先,我們確定哪些列是數字并包含數字 1 或 3:
sapply(df, function(z) is.numeric(z) & any(c(1, 3) %in% z)) # x s1 s2 s3 s4 # FALSE TRUE FALSE TRUE FALSE這將排除任何列,它是不是數字,這意味著一個
character包含一個文本列"1"或"3"將不被保留。這完全是我的推論;如果您想接受字串版本,請洗掉該is.numeric(z)組件。其次,我們提取那些真實的名字,并在前面加上
"x"c("x", names(which(sapply(df, function(z) is.numeric(z) & any(c(1, 3) %in% z))))) # [1] "x" "s1" "s3"unique(.)如果出于某種原因"x"也是數字并且包含 1 或 3 ,則將其包裝起來(此步驟純粹是防御性的,您可能并不嚴格需要它)選擇這些列,防御性地添加,
drop=FALSE以便如果只有一列匹配,它仍然回傳一個完整的data.frame僅用
"x"0 或 1替換那些列(不包括第一列);的z == 1回傳logical,和包裹(..)轉換邏輯為0(假)或1(真)。
dplyr
library(dplyr)
df %>%
select(x, where(~ is.numeric(.) & any(c(1, 3) %in% .))) %>%
mutate(across(-x, ~ (. == 1)))
# x s1 s3
# 1 x1 1 1
# 2 x2 0 1
# 3 x3 1 0
# 4 x4 0 0
# 5 x5 0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376484.html
下一篇:如何在年尺度上繪制月份值?
