【问题标题】:Change value in a 2-value column to its opposite only if a condition in another column is met仅当满足另一列中的条件时,才将 2 值列中的值更改为相反的值
【发布时间】:2017-07-09 09:34:57
【问题描述】:

我遇到了一些我必须在我的数据框中更改的字符串的问题。我的 df 结构如下:

df <- data.frame(Name = c("a2b", "a1a", "b2a", "a2b", "b1b", "b2a"),
                 Side = c("L", "R", "R", "L", "R", "L"))

    Name    Side
1    a2b       L
2    a1a       R
3    b2a       R
4    a2b       L
5    b1b       R
6    b2a       L

我想要做的是仅当“名称”值中有“2”时才将“侧”列中的值替换为相反的值(使值为“1”的行保持不变)。 “Side”列只有“R”和“L”作为可能的值。所以这是我想要得到的输出:

    Name    Side
1    a2b       R
2    a1a       R
3    b2a       L
4    a2b       R
5    b1b       R
6    b2a       R

我尝试了很多解决方案,但我才刚刚开始使用 R,所以我还不知道“if”语句是如何工作的。有什么办法吗?

【问题讨论】:

  • 能否请您展示一下到目前为止您尝试过的内容。
  • 我设法根据名称列中的数字进行细分,但我所能做的就是用某些东西替换 all 值,而不是用类似的东西交换值:mutate(Side = ifelse(grepl("2", Name), "newValue"))。我也试着把它写成一个“if”语句,但我真的不知道如何处理它们......

标签: r if-statement dataframe


【解决方案1】:

我们根据“名称”列中出现的“2”创建一个索引(“i1”),使用该索引,对“边”进行子集化,并使用chartr 更改值

i1 <- grep("2", df$Name)
df$Side[i1] <- chartr("LR", "RL", df$Side[i1])
df
#   Name Side
#1  a2b    R
#2  a1a    R
#3  b2a    L
#4  a2b    R
#5  b1b    R
#6  b2a    R

或者另一种选择是使用levels 进行分配,因为'Side' 列是factor

levels(df$Side[i1]) <- rev(levels(df$Side[i1]))

【讨论】:

  • 第一个解决方案效果很好,非常感谢!我不知道这个图表功能(不幸的是,也不知道级别)。
猜你喜欢
  • 2022-01-11
  • 2017-10-14
  • 1970-01-01
  • 2021-08-25
  • 2021-08-02
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多