【问题标题】:Get a single value from a data frame in R从R中的数据框中获取单个值
【发布时间】:2021-07-03 16:35:24
【问题描述】:

假设我有一个数据框 df,例如:

col1 col2
x1   y1
x2   y2

在每个“单元格”中具有任意值。 如何获得给定单元格的单个值?

例如要获取第一行和第二列中单元格的值,这样做:

df[1,2]

适用于数值,但也适用于字符串。

获取单个值的正确方法是什么(例如,用于另一个数据帧的子集的条件)?

编辑 关于我需要这个的更多细节。假设我需要使用 df 中的值来对另一个数据框 df2 进行子集化:

subset(df2, (id == SomeCommand(df[1,1])) & (name == SomeCommand(df[1,2])))

是否有任何这样的“SomeCommand”可以可靠地返回适当类型的单个值(无级别),而不管 df 中列的类型如何?

【问题讨论】:

  • as.character(df[1,2])
  • @Ronak Shah:这对字符串以外的任何东西都不起作用,对吧?是否有任何“稳健”的方式来获取单个值,无论它是什么类型?也许我的问题不够清楚。
  • 什么@RonakShah,您应该将其强制为factor 以外的其他内容。但本质上,它仍然只是一个值。
  • @GuitarExtended 不,它会强制任何字符。这比说as.numeric 更强大,这会混淆因素(将返回级别 number,而不是实际级别值)。话虽如此,您可能不需要强制转换为另一种类型来使用它进行进一步的子集化。

标签: r


【解决方案1】:

R 会不厌其烦地试图弄清楚你想要什么。如果你强迫性格,它应该工作。这是一个简单的例子。

> xy <- data.frame(a = c(0.1, 0.2, 0.3), b = factor(1:3), c = letters[1:3])
> 
> xy$a == 0.1
[1]  TRUE FALSE FALSE
> xy$a == "0.1"
[1]  TRUE FALSE FALSE
> xy$b == "2"
[1] FALSE  TRUE FALSE
> xy$b == 2
[1] FALSE  TRUE FALSE
> xy$c == "a"
[1]  TRUE FALSE FALSE

【讨论】:

  • 这意味着如果a 是数字且a == b,那么a + b 可能会抛出错误(例如,0.1 == "0.1" 为真而0.1 + "0.1" 失败)。我不知道这个。当然0.1 == "0.1000000000000000000000000001" 是假的,但0.1 == 0.1000000000000000000000000001 是真的。我不喜欢 R 中的另一个“功能”。非常容易出错。
  • 不确定是谁强迫你使用 R,但请告诉我他们的地址。我会给他们写一封非常坚定的信。
  • 我试图指出 R 的这个特性的风险,路过的读者可能没有意识到。也许还不够清楚。没有人强迫我使用 R,如果有的话,那宁愿相反。我在工作中经常使用 R,我喜欢它,这并不意味着我必须对它的缺陷视而不见。您的评论令人惊讶。
【解决方案2】:

一个常见的应用是在给定同一记录中一个或多个其他列变量的值的情况下,获取数据框中一个变量的特定值。为此,可以使用“过滤器”命令。它可能看起来很笨重,但它适用于大型数据框。

library(dplyr)
df
   rnames col1 col2 col3
1   row1    1    3    a
2   row2    2    6    b
3   row3    3    9    c
4   row4    4   12    d
5   row5    5   15    e

在给定 col3 = 'c' 的情况下找到 col1 的值

a <- filter(df, col3=='c')  # can specify multiple known column values
a                           #produces a data-frame with the record(s)               
 rnames col1 col2 col3
1   row3    3    9    c     # which contains Col1 = 3
class(a)
[1] "data.frame"
    

但是可以在一行中得到 Col1 的值

b <- filter(df, col3=='c')$col1   
b
[1] 3
 class(b)
[1] "numeric"

对于具有多个值的结果

c <- filter(df, col1 > 3)$col3  
c[1] "d" "e"            # list if  > 1 result
class(c)
[1] "character"

【讨论】:

    【解决方案3】:

    一种可行的方法是,在创建数据框时定义它的 colClasses: 例如:

    my_table = read.table("myfile.txt", sep=" ", colClasses = c("character", "character", "numeric"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多