gpt4 book ai didi

r - 使用数据表对子集执行操作

转载 作者:行者123 更新时间:2023-12-04 14:02:28 25 4
gpt4 key购买 nike

我有一个广泛形式的调查数据集。对于特定问题,在原始数据中创建了一组变量来表示调查问题在特定月份提出的不同事实。

我希望创建一组具有月份不变名称的新变量;这些变量的值将对应于观察到的月份的月份变量问题的值。

请查看示例/虚构数据集:

require(data.table)

data <- data.table(month = rep(c('may', 'jun', 'jul'), each = 5),
may.q1 = rep(c('yes', 'no', 'yes'), each = 5),
jun.q1 = rep(c('breakfast', 'lunch', 'dinner'), each = 5),
jul.q1 = rep(c('oranges', 'apples', 'oranges'), each = 5),
may.q2 = rep(c('econ', 'math', 'science'), each = 5),
jun.q2 = rep(c('sunny', 'foggy', 'cloudy'), each = 5),
jul.q2 = rep(c('no rain', 'light mist', 'heavy rain'), each = 5))

在本次调查中,实际上只有两个问题:“q1”和“q2”。这些问题中的每一个都被反复问了几个月。但是,仅当数据中观察到的月份与特定月份的调查问题相匹配时,观察才包含有效响应。

例如:对于“May”中的任何观察,“may.q1”被观察为“yes”。我想要一个新的“Q1”变量来代表“may.q1”、“jun.q1”和“jul.q1”。当月份为“may”时,“Q1”的值将采用“may.q1”的值,当月份为“jun”时,“Q1”的值将采用“jun.q1”的值.

如果我尝试使用数据表手动执行此操作,我会想要以下内容:
mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F]
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata)))

我希望这个重复“按=月”。

如果我将“plyr”包用于数据框,我将使用以下方法解决:
require(plyr)
data <- data.frame(data)

mdata <- ddply(data, .(month), function(dfmo) {
dfmo <- dfmo[, c(1, grep(dfmo$month[1], names(dfmo)))]
names(dfmo) <- gsub(paste0(dfmo$month[1], '\\.'), '', names(dfmo))
return(dfmo)
})

任何使用 data.table 方法的帮助将不胜感激,因为我的数据很大。谢谢你。

最佳答案

一种不同的方式来说明:

data[, .SD[,paste0(month,c(".q1",".q2")), with=FALSE], by=month]

month may.q1 may.q2
1: may yes econ
2: may yes econ
3: may yes econ
4: may yes econ
5: may yes econ
6: jun lunch foggy
7: jun lunch foggy
8: jun lunch foggy
9: jun lunch foggy
10: jun lunch foggy
11: jul oranges heavy rain
12: jul oranges heavy rain
13: jul oranges heavy rain
14: jul oranges heavy rain
15: jul oranges heavy rain

但请注意列名来自第一组(之后可以使用 setnames 重命名)。如果有大量列而只需要很少的列,它可能不是最有效的。在这种情况下,Arun 的解决方案融合为长格式应该会更快。

关于r - 使用数据表对子集执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16153742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com