【问题标题】:extract values within a range across an entire dataframe in r在 r 中提取整个数据帧范围内的值
【发布时间】:2023-04-10 14:55:01
【问题描述】:

我正在尝试提取数据框中的特定值。我正在尝试这样做,因为我想从我保存为数据框的输出中收集相关信息,以便我可以提取感兴趣的信息。

我创建了一个包含残差相关性的数据框。我添加了一个包含项目名称的列,而不是使用行名称。如果残差相关的值高于 0.15,我编写了一个返回列名的函数: rescorpair .15 & x

我在下面包含了一个可重现的示例,但通过以下方式简化了示例。而不是残差相关,我只是制作了一个与几个项目相关的数据框。

生成数据框:

item1<-c(1,3,2,4,5,5)
item2<-c(2,3,5,4,5,4)
item3<-c(3,2,4,5,4,4)
items<-cbind(item1,item2,item3)
corrdata<-Hmisc::rcorr(items)
corr<-as.data.frame(corrdata$r)
corr$itemn<-c("item1","item2","item3")

我更改了有关返回列名的函数的一些内容以适合示例数据(我更改了我想要选择的值的范围)

itemcorr <- apply(corr, 1, function(x) paste(colnames(corr)[which((x > .6 & x < 1.00) |x < -.6 )], collapse = ", "))

我希望输出的值如下所示: 项目 1 项目 2 项目 3 “”“0.60737”“”

或者这个 项目 1 项目 2 项目 3 "" "0.60737" "0.60737"

这是我的第一个问题,如果我需要添加任何信息或进行任何编辑,请告诉我。

【问题讨论】:

  • 请展示一个带有dput 和预期输出的可重复的小例子
  • 为了进一步了解@akrun 的观点,您可以找到有关如何创建最小的、可重复的示例here 的指南。
  • 我添加了一个可重现的示例以及我希望我的预期输出是什么

标签: r dataframe extract


【解决方案1】:

您可以使用 dplyr 执行类似的操作,方法是将数据从宽格式转换为长格式,然后应用条件。

这里是一个如何做的例子;

library(dplyr)

# Creating items
item1 <- c(1,3,2,4,5,5)
item2 <- c(2,3,5,4,5,4)
item3 <- c(3,2,4,5,4,4)
items <- cbind(item1, item2, item3)

# Calculating correlation
corrdata <- Hmisc::rcorr(items)

# Creating dataframe from correlation list
corr <- 
  as.data.frame(corrdata$r) %>% # Converting to dataframe
  tibble::rownames_to_column() %>% # Adding row names
  tidyr::gather(key = "item", value = "value", -rowname) %>% # From wide to long
  filter((value > .6 & value < 1.00) | value < -.6) # Adding condition

apply(corr, 1, paste, collapse = " ") # To paste into character

# [1] "item3 item2 0.6073734" 
# [2] "item2 item3 0.6073734"

【讨论】:

  • 谢谢,这行得通。有没有办法做到这一点,而不必将数据从宽转换为长?这是我在分析数据时需要重复多次的事情,所以我想知道是否有一些步骤更少。
  • 在使用了这两种解决方案之后,我选择了这个,因为结果很容易使用。它看起来有点长,但最终效率更高。我试图为两者投票,但不能。
【解决方案2】:

您可以按行使用apply,检查范围内是否有任何值并返回该值或返回NA

apply(corr[-4], 1, function(x) {
   inds <- which(x > 0.6 & x < 1)
   if(length(inds)) x[inds] else NA
})

#  item1   item2   item3 
#     NA 0.60737 0.60737 

【讨论】:

  • 谢谢!这是一个简单的解决方案。我想知道您是否可以帮助解决我在将代码转换为具有 NA 值的实际数据时遇到的错误。我收到错误“需要 TRUE/FALSE 的缺失值”。我相信这是因为我的数据框中缺少值。我尝试在您拥有的 if 语句之前添加 and felse(is.na(inds) (添加 true 值,然后添加 false 函数,但它没有解决问题。
  • @HeatherClark 我已经更新了答案。你能检查更新的答案吗?
  • 这行得通,但结果现在是一个嵌套列表。这是一个有用的选项,所以谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2014-07-24
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多