首页 文章

R:琴弦上的头/尾

提问于
浏览
0

我需要重新解释我的问题,因为我没有在我的数据框中包含其他类型的数据,这会在使用空格分割时导致很多问题 . 我真的很抱歉!

重要提示:整个数据集中不能信任空白,因为它们以不稳定的方式出现,即使在相同类型的日期中也是如此(在我的示例中为type1a,type1b)

df <- data.table(v=c( "       555 OUT XYZ STR44W PASSED TRUE",   #interesting data type1
                      "       A 45 OUT XYW STR44W PASSED TRUE",
                      "       555 OUT XYZ STR55W PASSED TRUE",
                      "       6755 OUT XYZ 4444W PASSED TRUE",
                      "  75/850CC/PF                         ",   #eratic data to be ignored
                      " BY HHU 56TT00 6 415 UP HHU 88H900   ",   #interesting data type2
                      "       555 OUT WWWZ STR44W PASSED TRUE"))

期望的结果:

T1  T2  T1_V1   T1_V2   T1_V3   T2_V1   T2_V2   T2_V3   T2_V4 T2_V5
1   0   555     XYZ     STR44W  NA      NA      NA      NA    NA
1   0   A 45    XYW     STR44W  NA      NA      NA      NA    NA
1   0   555     XYZ     STR55W  NA      NA      NA      NA    NA
1   0   6755    XYZ     4444W   NA      NA      NA      NA    NA
0   0   NA      NA      NA      NA      NA      NA      NA    NA
0   1   NA      NA      NA      HHU     56TT00  6 415   HHU   88H900
1   0   555     NA      STR44W  NA      NA      NA      NA    NA

现在为type1数据解决方案:library(data.table)

df < - data.table(v = c(“555 OUT XYZ STR44W PASSED TRUE”,#Type1a“A 45 OUT XYW STR44W PASSED TRUE”,#Type1b“555 OUT XYZ STR55W PASSED TRUE”,#Type1a“6755 OUT XYZ 4444W PASSED TRUE“,#Type1a”75 / 850CC / PF“,#!!新系列的古老数据”BY HHU 56TT00 6 415 UP HHU 88H900“,#Type2”555 OUT WWWZ STR44W PASSED TRUE“))#Type1a

df$T1<-0
df$T1[grepl("PASSED TRUE", df$v)]<-1
df$T1_V1[df$T1==1]<-df$T1_V1
df$T1_V1[df$T1==1] <-gsub("\\OUT.*","",df$v) #Getting rid of the everything after "OUT"
df$T1_V2[df$T1==1]<-gsub(".*\\OUT","",df$v)#Getting rid of the everything before "OUT"
df$T1_V2 <-gsub("\\PASSED.*","",df$T1_V2) #Getting rid of the everything after "PASSED"
df$T1_V2<-strsplit(df$T1_V2, "[[:blank:]*]") # Seperation of the two relevant strings by stringsplit
df$T1_V2<- lapply(df$T1_V2, head)

问题:stringplit允许在单个具有更多空格的异常数据结构后选择正确的块

- > gsub字符串向下是额外的努力,但对于一些数据,这是确保不稳定的空白不会弄乱变量的唯一方法

- >如何将df $ T1_V2转换回普通字符变量而不留空格?

老问题:

第一篇文章,我尽我所能找到答案并准备我的问题 .

我需要清理一个令人讨厌的字符串,其中有很多空格不规则 . 我尝试在“OUT”之前获得第一个块,在“OUT”和“PASSED”之间获得第二个和第三个块 . 之后,应使用列表检查数据,以控制v4是否正确 .

使用stringsplit和afterwars头/尾不起作用,我将非常感谢任何帮助!提前谢谢了

library(data.table)

df <- data.table(v=c("       555 OUT XYZ STR44W PASSED TRUE",
                                  "       A 45 OUT XYW STR44W PASSED TRUE",
                                  "       555 OUT XYZ STR55W PASSED TRUE",
                                  "       6755 OUT XYZ 4444W PASSED TRUE",
                                  "       555 OUT WWWZ STR44W PASSED TRUE"))
control <-data.table(control=c("XYZ","PPO","XMX","WWWZ"))

df$v1 <-gsub("\\OUT.*","",df$v) #Getting rid of the everything after "OUT"
df$v2<-gsub(".*\\OUT","",df$v) #Getting rid of the everything before "OUT"
df$v2 <-gsub("\\PASSED.*","",df$v2) #Getting rid of the everything after "PASSED"
df$v2<-strsplit(df$v2, "[[:blank:]*]") # Seperation of the two relevant strings by stringsplit
df$v3<- lapply(df$v2, head) #Taking the first element from the stringsplit 
df$v4<- lapply(df$v2, head,2) #Taking the second element from the stringsplit

运行之后,在r-studio中我得到v(“”,“XYZ”)为v4 . 第一个元素似乎是一个空元素?我无法通过直接从我的控制列表(fail1)控制,也不能通过转换(fail2)或unlist(fail3)来继续使用该表达式

#fail#1
df$v4[!(df$v4 %in% control$control)] <- NA

#fail#2
df$v4 <- as.character(df$v4)

#fail3
df$v4 <- unlist(df$v4)

2 回答

  • 0

    这适用于您当前的数据,使其更整洁 .

    library(data.table)
    
    df <- data.table(v=c("       555 OUT XYZ STR44W PASSED TRUE",
                                      "       A 45 OUT XYW STR44W PASSED TRUE",
                                      "       555 OUT XYZ STR55W PASSED TRUE",
                                      "       6755 OUT XYZ 4444W PASSED TRUE",
                                      "       555 OUT WWWZ STR44W PASSED TRUE"))
    control <-data.table(control=c("XYZ","PPO","XMX","WWWZ"))
    
    df$v1 <-gsub("\\OUT.*","",df$v) #Getting rid of the everything after "OUT"
    df$v2<-gsub(".*\\OUT","",df$v) #Getting rid of the everything before "OUT"
    

    修剪空白并用空格分割,然后将其cbind到当前的df . 然后我们可以重命名列,以便更容易导航 .

    lists <- strsplit(trimws(df$v2), " ")
    extra <- data.frame(do.call(rbind, lists))
    newdf <- cbind(df, extra)
    colnames(newdf) <- c("full string", paste0("piece_", 1:6))
    
    newdf
                                  full string      piece_1                  piece_2 piece_3 piece_4 piece_5 piece_6
    1:         555 OUT XYZ STR44W PASSED TRUE         555    XYZ STR44W PASSED TRUE     XYZ  STR44W  PASSED    TRUE
    2:        A 45 OUT XYW STR44W PASSED TRUE        A 45    XYW STR44W PASSED TRUE     XYW  STR44W  PASSED    TRUE
    3:         555 OUT XYZ STR55W PASSED TRUE         555    XYZ STR55W PASSED TRUE     XYZ  STR55W  PASSED    TRUE
    4:         6755 OUT XYZ 4444W PASSED TRUE        6755     XYZ 4444W PASSED TRUE     XYZ   4444W  PASSED    TRUE
    5:        555 OUT WWWZ STR44W PASSED TRUE         555   WWWZ STR44W PASSED TRUE    WWWZ  STR44W  PASSED    TRUE
    
  • 0

    我并不完全明白你的最终结果要求是什么 . 您不需要在每一步都使用 gsub . 您可以按 space 拆分所有内容,然后选择需要进一步操作的列 .

    library(tidyr)
    library(splitstackshape) # cSplit function    
    
    df_selected <- df %>% cSplit("v", " ") %>% select(v_1,v_3,v_4,v_6)
    
    control <-data.table(control=c("XYZ","PPO","XMX","WWWZ"))
    filter(df_selected, v_3 %in% control$control)
    

相关问题