【问题标题】:How to find row number of a value in R code如何在R代码中查找值的行号
【发布时间】:2014-01-13 22:55:20
【问题描述】:

在以下一组值中,如何在第 4 列中找到特定值的行号??

例如,如何使用 R 代码命令找到第 4 列中值“1578”的行号。

> mydata_2
   sex age height_seca1 height_chad1 height_DL weight_alog1
1    F  19         1800         1797       180         70.0
2    F  19         1682         1670       167         69.0
3    F  21         1765         1765       178         80.0
4    F  21         1829         1833       181         74.0
5    F  21         1706         1705       170        103.0
6    F  18         1607         1606       160         76.0
7    F  19         1578         1576       156         50.0
8    F  19         1577         1575       156         61.0
9    F  21         1666         1665       166         52.0
10   F  17         1710         1716       172         65.0
11   F  28         1616         1619       161         65.5
12   F  22         1648         1644       165         57.5
13   F  19         1569         1570       155         55.0
14   F  19         1779         1777       177         55.0
15   M  18         1773         1772       179         70.0
16   M  18         1816         1809       181         81.0
17   M  19         1766         1765       178         77.0
18   M  19         1745         1741       174         76.0
19   M  18         1716         1714       170         71.0
20   M  21         1785         1783       179         64.0
21   M  19         1850         1854       185         71.0
22   M  31         1875         1880       188         95.0
23   M  26         1877         1877       186        105.5
24   M  19         1836         1837       185        100.0
25   M  18         1825         1823       182         85.0
26   M  19         1755         1754       174         79.0
27   M  26         1658         1658       165         69.0
28   M  20         1816         1818       183         84.0
29   M  18         1755         1755       175         67.0

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    如果您想知道matrixdata.frame 中值的行和列,请考虑使用arr.ind=TRUE 参数到which

    > which(mydata_2 == 1578, arr.ind=TRUE)
      row col
    7   7   3
    

    所以 1578 在第 3 列(您已经知道)和第 7 行。

    【讨论】:

      【解决方案2】:

      我很想使用grepl,它应该为所有行提供匹配项,并且可以推广到任意字符串。

      mydata_2 <- read.table(textConnection("
      sex age height_seca1 height_chad1 height_DL weight_alog1
      1 F 19 1800 1797 180 70.0
      2 F 19 1682 1670 167 69.0
      3 F 21 1765 1765 178 80.0
      4 F 21 1829 1833 181 74.0
      5 F 21 1706 1705 170 103.0
      6 F 18 1607 1606 160 76.0
      7 F 19 1578 1576 156 50.0
      8 F 19 1577 1575 156 61.0
      9 F 21 1666 1665 166 52.0
      10 F 17 1710 1716 172 65.0
      11 F 28 1616 1619 161 65.5
      12 F 22 1648 1644 165 57.5
      13 F 19 1569 1570 155 55.0
      14 F 19 1779 1777 177 55.0
      15 M 18 1773 1772 179 70.0
      16 M 18 1816 1809 181 81.0
      17 M 19 1766 1765 178 77.0
      18 M 19 1745 1741 174 76.0
      19 M 18 1716 1714 170 71.0
      20 M 21 1785 1783 179 64.0
      21 M 19 1850 1854 185 71.0
      22 M 31 1875 1880 188 95.0
      23 M 26 1877 1877 186 105.5
      24 M 19 1836 1837 185 100.0
      25 M 18 1825 1823 182 85.0
      26 M 19 1755 1754 174 79.0
      27 M 26 1658 1658 165 69.0
      28 M 20 1816 1818 183 84.0
      29 M 18 1755 1755 175 67.0"),
                             sep = " ", header = TRUE)
      
      which(grepl(1578, mydata_2$height_seca1))
      

      输出是:

      > which(grepl(1578, mydata_2$height_seca1))
      [1] 7
      > 
      

      [编辑] 但是,正如 cmets 中所指出的,这将捕获比字符串 1578 更多的内容(例如,它也匹配 21578 等),因此只有在您确定值的长度时才应使用您正在搜索的字符不会超过此处显示的四个字符或数字。

      根据其他答案进行子集化也可以正常工作:

      mydata_2[mydata_2$height_seca1 == 1578, ]
        sex age height_seca1 height_chad1 height_DL weight_alog1
      7   F  19         1578         1576       156           50
      > 
      

      如果您正在寻找几个不同的值,您可以将它们放在一个向量中,然后使用%in% 运算符:

      look.for <- c(1578, 1658, 1616)
      > mydata_2[mydata_2$height_seca1 %in% look.for, ]
         sex age height_seca1 height_chad1 height_DL weight_alog1
      7    F  19         1578         1576       156         50.0
      11   F  28         1616         1619       161         65.5
      27   M  26         1658         1658       165         69.0
      > 
      

      【讨论】:

      • 我觉得这里的grepl有问题,> grepl(1578, c(1578, 15780, 21578)) [1] TRUE TRUE TRUE
      • 当然,你是对的,它不仅可以捕获一个简单的==,但有时也可以。
      • 使用grepl,您可以利用正则表达式精确匹配您想要的内容。例如。 grepl("^1578$", c(1578, 15780, 21578)).
      • 首先,不要使用正则表达式来测试相等性!其次,如果你确实想使用正则表达式,不要写which(grepl(...))grep(...) 在语义上是等价的,更容易阅读,而且可能更快。
      【解决方案3】:

      您可以简单地使用which() 函数来代替1:nrow(mydata_2)which(mydata_2[,4] == 1578)

      尽管如上所述,第 3 列包含 1578,而不是第四列: which(mydata_2[,3] == 1578)

      【讨论】:

        【解决方案4】:
        (1:nrow(mydata_2))[mydata_2[,4] == 1578]
        

        当然,值 1578 的行可能不止一行。

        【讨论】:

        • 它返回为integer(0) 你能告诉我完整的语法吗?
        • 您在寻找第 7 行的 1578 吗?即第 3 列,打印输出中的第一列是行号。试试 (1:nrow(mydata_2))[mydata_2[,3] == 1578]。
        • 您不需要(1:nrow(mydata_2)),只需使用whichwhich(mydata_2[,3] == 1578)
        • 我刚刚复制了数据框并将其加载到 R,它工作正常。
        • @user3136251 integer(0) 表示没有包含 1578 的行(在该列中),而不是代码语法错误。
        【解决方案5】:

        从 R 3.3.0 开始,可以使用startsWith() 作为grepl() 的更快替代方案:

        which(startsWith(mydata_2$height_seca1, 1578))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多