R 如何使用半一致格式重命名观测值?

R 如何使用半一致格式重命名观测值?,r,dataframe,R,Dataframe,我正在使用以下数据帧: Team Direction Side Joe HB-L L Eric HB-R R Tim FB-L R Mike HB L 我想删除“方向”栏中“L”或“R”前面的“HB”或“FB”。我还想消除“方向”列中没有“L”或“R”的观察结果。我希望它看起来像这样: Team Direction

我正在使用以下数据帧:

Team       Direction      Side
Joe         HB-L           L
Eric        HB-R           R
Tim         FB-L           R
Mike        HB             L
我想删除“方向”栏中“L”或“R”前面的“HB”或“FB”。我还想消除“方向”列中没有“L”或“R”的观察结果。我希望它看起来像这样:

Team       Direction      Side
Joe         L              L
Eric        R              R
Tim         L              R

然后,我想添加一列,指示“方向”和“侧面”列是否相同。如果是,我希望它读“近”,如果不是,我希望它读“远”


我们可以使用
sub
base R
中执行此操作,以在根据“方向”中存在的
-
对行进行子设置后,移除子字符串,直到
-

df1 <- subset(df1, grepl('-', Direction))
df1$Direction <- sub(".*-", "",  df1$Direction)
然后,我们可以使用
==
创建一个逻辑条件,将值替换为“远”、“近”

df1$Relation <- with(df1, c('FAR', 'NEAR')[(Direction == Side) + 1])

或使用
tidyverse

library(dplyr)
library(stringr)
df1 %>%
     filter(grepl('-', Direction)) %>% 
     mutate(Direction = str_replace(Direction, '.*-', ''), 
        Relation = case_when(Direction == Side ~ 'NEAR', TRUE ~ 'FAR'))
#   Team Direction Side Relation
#1  Joe         L    L     NEAR
#2 Eric         R    R     NEAR
#3  Tim         L    R      FAR

或使用
data.table

 library(data.table)
 setDT(df1)[grepl('-', Direction)][, Direction := trimws(Direction,
     whitespace = '.*-')][, Relation := fifelse(Direction == Side, 'NEAR', 'FAR')][]
#   Team Direction Side Relation
#1:  Joe         L    L     NEAR
#2: Eric         R    R     NEAR
#3:  Tim         L    R      FAR
数据
df1我们可以首先
过滤
其中包含
“-”
的行,删除所有内容,直到
“-”
为止,并使用
if_else
'NEAR'
'FAR'
值分配给
关系

library(dplyr)
library(stringr)

df %>%
  filter(str_detect(Direction, '-')) %>%
  mutate(Direction = str_remove(Direction, '.*-'), 
         Relation = if_else(Direction == Side, 'NEAR', 'FAR'))

#  Team Direction Side Relation
#1  Joe         L    L     NEAR
#2 Eric         R    R     NEAR
#3  Tim         L    R      FAR
library(dplyr)
library(stringr)
df1 %>%
     filter(grepl('-', Direction)) %>% 
     mutate(Direction = str_replace(Direction, '.*-', ''), 
        Relation = case_when(Direction == Side ~ 'NEAR', TRUE ~ 'FAR'))
#   Team Direction Side Relation
#1  Joe         L    L     NEAR
#2 Eric         R    R     NEAR
#3  Tim         L    R      FAR
 library(data.table)
 setDT(df1)[grepl('-', Direction)][, Direction := trimws(Direction,
     whitespace = '.*-')][, Relation := fifelse(Direction == Side, 'NEAR', 'FAR')][]
#   Team Direction Side Relation
#1:  Joe         L    L     NEAR
#2: Eric         R    R     NEAR
#3:  Tim         L    R      FAR
df1 <- structure(list(Team = c("Joe", "Eric", "Tim", "Mike"), Direction = c("HB-L", 
"HB-R", "FB-L", "HB"), Side = c("L", "R", "R", "L")),
class = "data.frame", row.names = c(NA, 
-4L))
library(dplyr)
library(stringr)

df %>%
  filter(str_detect(Direction, '-')) %>%
  mutate(Direction = str_remove(Direction, '.*-'), 
         Relation = if_else(Direction == Side, 'NEAR', 'FAR'))

#  Team Direction Side Relation
#1  Joe         L    L     NEAR
#2 Eric         R    R     NEAR
#3  Tim         L    R      FAR