【问题标题】:head(data) and data["rowname", ] not showing the same results [duplicate]头(数据)和数据[“行名”,]没有显示相同的结果[重复]
【发布时间】:2020-06-29 23:32:24
【问题描述】:

以下是我脚本的前几行:

library(tidyverse)
library(caret)

# Read and clean up the data
ugriz <- read.table(
    "F:/Users/Jeremy Moss/Dropbox/Astro at VUW/PhD stuff/data_files/optical_data/QSOs_1st_50k.dat-mags.dat")
ugriz[ugriz == -999] <- NA
fields <- c('name', 'z','delta_z','NED_class','SDSS_class','no_radio','radio_max','no_UV', 'UV_min',
    'u', 'g', 'r', 'i', 'z_mag', 'I', 'J', 'H', 'K', 'W1', 'SPIT_5', 'W2', 'SPIT_8', 'W3', 'W4', 'NUV', 'FUV')
names(ugriz) <- fields
mags <- fields[10:26]

head(ugriz)
ugriz['SDSSJ094736.54-005905.6',]

输出是

> head(ugriz)
                     name       z delta_z NED_class SDSS_class no_radio radio_max no_UV UV_min      u      g      r
1 SDSSJ094736.54-005905.6 0.65218 0.00013       QSO        QSO        0        12     7   14.8 20.078 19.679 19.585
2 SDSSJ094745.26-004113.2 2.83059 0.00061       QSO        QSO        0        12     4   14.8 21.468 19.695 19.343
3 SDSSJ094532.67-010003.3 3.03664 0.00037       QSO        QSO        0        12    10   14.8 20.443 19.115 18.918
4 SDSSJ094545.11-003921.6 1.47375 0.00044       QSO        QSO        0        12     9   14.8 19.723 19.593 19.353
5 SDSSJ094703.31+000228.9 1.77191 0.00170       QSO        QSO        0        12     7   14.8 19.683 19.393 19.273
6 SDSSJ094454.24-004330.3 2.28794 0.00032       QSO        QSO        0        12     7   14.8 19.769 19.233 19.083
       i  z_mag      I      J      H      K     W1 SPIT_5     W2 SPIT_8     W3    W4    NUV    FUV
1 19.406 19.370 19.023     NA     NA     NA 14.970     NA 13.992     NA 11.507 8.756 20.122 20.736
2 18.923 18.650 18.539 16.925 16.333 15.817     NA     NA     NA     NA     NA    NA     NA 20.511
3 18.749 18.698 18.365     NA     NA     NA 14.638     NA 14.041     NA 11.174 8.751 21.646 21.456
4 19.175 19.258 18.791 18.368 17.701 17.340 15.193     NA 14.354     NA 11.328    NA 21.122 21.090
5 18.995 18.950 18.611 18.148 17.831 17.233 15.545     NA 14.530     NA 11.573    NA 22.465 20.091
6 18.983 18.768 18.599 17.840 17.121 16.170 14.978     NA 14.224     NA 11.489    NA 21.684 20.314

> ugriz['SDSSJ094736.54-005905.6',]
   name  z delta_z NED_class SDSS_class no_radio radio_max no_UV UV_min  u  g  r  i z_mag  I  J  H  K W1 SPIT_5 W2 SPIT_8
NA <NA> NA      NA      <NA>       <NA>       NA        NA    NA     NA NA NA NA NA    NA NA NA NA NA NA     NA NA     NA
   W3 W4 NUV FUV
NA NA NA  NA  NA

head(ugriz) 给出了预期的输出,但是当我用ugriz['SDSSJ094736.54-005905.6',] 引用特定行(在这种情况下是第一行,但它发生在所有人身上)时,我得到了所有NAs。这是为什么呢?

【问题讨论】:

    标签: r


    【解决方案1】:

    在使用ugriz[, ] 进行子集化时,您需要传递行名。行名可以用

    rownames(ugriz)
    # [1] "1" "2" "3" "4" ....
    

    在这种情况下,您的行名称是“1”、“2”、“3”等。所以您可以使用ugriz["1", ]。在这种情况下,您的行名称与您的行索引基本相同。例如,如果您对数据进行子集化,这可能会发生变化。您将看到“行名”与拥有名为name 的列不同。如果您想在基础 R 中按列值进行子集化,请使用

    ugriz[ugriz$name=='SDSSJ094736.54-005905.6',]
    

    subset(ugriz, name=='SDSSJ094736.54-005905.6')`
    

    【讨论】:

    • 据我所见,我遵循r-tutor.com/r-introduction/data-frame/data-frame-row-slice 在“数字索引”和“名称索引”下找到的命名法。那里和我在做什么有什么区别?
    • 您没有行名。您有一个名为“名称”的列。请注意,在其他页面中,行名列没有标题/列名。如果您喜欢 rownames(ugriz)&lt;-ugriz$name ,您可以在导入后设置行名。但是,如果您打算使用任何 tidyverse 函数,请注意这些函数会忽略/删除行名,而是希望所有相关数据都位于适当的列中。
    • Jim421616,不要把那个页面的句子 "We can retrieve a row by its name""We can retrieve a row by "name"",我使用code 格式来建议框架中字段的名称。 R 不检查名为name 的列的框架;如果您尝试对字符串进行索引(即使该字符串是"1"),它会查找与您提供的字符串匹配的rownames(ugriz),它不会查找名为"name" 的列;如果您尝试对一个数字进行索引,它 truncates 该数字并为您提供该行号,无论其行名或名为 "name" 的列是否存在。
    • 我赞同 MrFlick 对行名的警告:tidyverse 包不仅不尝试保存或使用它们,而且经常故意删除它们(比较 rownames(mtcars)rownames(as_tibble(mtcars)) 看到这个在行动)。如果您需要行名,请将它们保存为数据中的一列,可能使用tibble::rownames_to_column(或类似名称),否则不要指望它们。
    • 啊,我不能使用rownames(ugriz)&lt;-ugriz$name,因为我的一些行是重复的。我将在一个单独的问题中询问将它们合并。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 2016-12-16
    • 1970-01-01
    • 2017-11-23
    • 2022-08-19
    • 2017-02-10
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多