【问题标题】:In R, select elements from a column if they occupy the same row as elements of another column在R中,如果元素与另一列的元素占据同一行,则从列中选择元素
【发布时间】:2019-07-20 00:08:30
【问题描述】:

这个问题可能已经在别处问过了,但由于我是 R 新手,而且我的词汇量有限,我似乎找不到它。

如果我有一个字符填充的数据框,说:

c1 <- c("aa", "bb", "cc", "dd", "ee")
c2 <- c("ff", "gg", "hh", "ii", "jj")
c3 <- c("kk", "ll", "mm", "nn", "oo")
c4 <- c("pp", "qq", "rr", "ss", "tt")
c5 <- c("uu", "vv", "ww", "xx", "yy")
df <- cbind.data.frame(c1, c2, c3, c4, c5)

导致

  c1 c2 c3 c4 c5
1 aa ff kk pp uu
2 bb gg ll qq vv
3 cc hh mm rr ww
4 dd ii nn ss xx
5 ee jj oo tt yy

我想从第 4 列中选择与第 2 列中的多个元素(例如“gg”、“ii”和“jj”)占据同一行的元素,有没有办法做到这一点对每个使用不同的命令?

例如,

df$c4[i = c(2,4,5)]

会回来

[1] qq ss tt
Levels: pp qq rr ss tt

df$c4[df$c2 == "gg"]

会回来

[1] qq
Levels: pp qq rr ss tt

但是当我尝试将两者结合起来时

df$c4[i = c(df$c2=="gg", df$c2=="ii", df$c2=="jj")]

R 似乎只是部分知道该怎么做,返回

[1] qq   <NA> <NA>
Levels: pp qq rr ss tt

【问题讨论】:

  • 这个df$c4[df$c2 %in% c("gg", "ii", "jj")] 有效,它给[1] qq ss tt

标签: r dataframe indexing subset


【解决方案1】:

不确定您真正想要完成什么,但在最后一行中,这就是您实际在做的事情:

> df$c4[i = c(df$c2=="gg", df$c2=="ii", df$c2=="jj")]
[1] "qq" NA   NA  
> i = c(df$c2=="gg", df$c2=="ii", df$c2=="jj")
> i
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
[10] FALSE FALSE FALSE FALSE FALSE  TRUE
> df$c2
[1] "ff" "gg" "hh" "ii" "jj"

您将一个长度为 15 的逻辑向量传递给一个长度为 5 的字符向量,这没有多大意义。

【讨论】:

  • 谢谢!!对于像我这样的绝对初学者来说,很容易将[] 之类的东西视为一个黑匣子,而忘记了我实际上在做什么。您的回复让我想到了如何传递长度为 5 的逻辑向量,这让我意识到我正在寻找的代码是 df$c4[df$c2=="gg" | df$c2=="ii" | df$c2=="jj"] - 非常基本
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2019-11-23
  • 2015-04-04
相关资源
最近更新 更多