簡體   English   中英

從數據框 R 中提取某些列

[英]Extract certain columns from data frame R

我的數據框如下所示:

   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'))```

是否可以提取包含整數13的數據框列? 例如,新的數據框如下所示:

 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 將s1s3列更改為 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

底座 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

    這將排除任何不是數字的列,這意味着將不會保留包含文字"1""3"character列。 這是我的完整推斷; 如果您想接受字符串版本,則刪除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"
  • 如果出於某種原因, "x"也是數字並且包含 1 或 3,則將其包裝在unique(.)中(此步驟純粹是防御性的,您可能並不嚴格需要它)

  • select 那些列,防御性地添加drop=FALSE以便如果只有一列匹配,它仍然返回完整的data.frame

  • 僅用 0 或 1 替換那些列(不包括第一列是"x" ); z == 1返回logical ,包裝+(..)將 logical 轉換為 0 (false) 或 1 (true)。

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

我認為這是您所期望的:

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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM