根据 R 中的变量将数据重塑为长列以获得 IRR
Reshape data into long columns based on variable in R for IRR
有数以千计的答案描述了如何从宽变长并按特定变量进行组织。我不知道我没有在思考什么。
我需要将最初以 rater、obs、val1、val2 等开头的行组织到 IRR 的 rater 下的列中。
给定类似于我的数据的格式,可以使用以下格式创建:
r1 <- c('bob', 'sally', "george", "bob", "sally", "george")
r2 <- c(1,1,1,2,2,2)
r3 <- c("bad", "good", "good", "good", "good", "bad")
r4 <- c("bad", "bad", "good", "good", "good", "bad")
df=data.frame(r1,r2,r3,r4)
df = setNames(df, c('rater','obs', 'val1', 'val2'))
我需要根据 'rater' 将数据组织到列中。任何有用的东西都会很棒,特别是如果可以保留 'obs'(观测值),例如 obs1_val1、obs1_val2 等
对于类似的东西:
dcast(df, obs ~ rater)
创建:
obs bob george sally
1 1 bad good bad
2 2 good bad good
但是,这会聚合并删除 val2 的值。
相反,我需要以下内容:
bob sally george
obs1_val1 bad good good
obs1_val2 bad bad good
obs2_val1 good good bad
obs2_val2 good good bad
查看类似的 responses,我看到了对 melt
的建议,然后是 dcast
[我实际上并不想聚合 - 而是只是按列堆叠]。
因为 val1 和 val2 的字符串应该是我尝试过的因素:
df$"val1" <- factor(df$val1, levels=c("bad","good"))
df$"val2" <- factor(df$val2, levels=c("bad","good"))
没有任何效果。获取:
Aggregation function missing: defaulting to length
obs bob george sally
1 1 2 2 2
2 2 2 2 2
这没有帮助。
?
tidyverse 选项。
library(tidyverse)
df %>%
gather(val1, val2, key = "eval", value = "value") %>%
spread(key = rater, value = value)
然后您可以选择完全删除 'obs' 列或使用 unite()
.
将 'obs' 和 'eval' 合并为一个列
考虑对 val1 和 val2 列进行 rbinding dcast()
调用。此外,添加一列以捕获相应的 val 值(因为它在 dcast
期间被删除)。因此,使用 data.frame()
:
rdf <- rbind(data.frame(val=c("va1"), dcast(df, obs ~ rater, value.var="val1")),
data.frame(val=c("va2"), dcast(df, obs ~ rater, value.var="val2")))
# val obs bob george sally
# 1 va1 1 bad good good
# 2 va1 2 good bad good
# 3 va2 1 bad good bad
# 4 va2 2 good bad good
如果有很多 val 列,用 lapply()
迭代,然后在列表上 do.call(rbind, ...)
迭代:
valcols <- names(df)[grep("val", names(df))]
dfList <- lapply(valcols, function(v) {
data.frame(val=c(v), dcast(df, obs ~ rater, value.var=v))
})
rdf <- do.call(rbind, dfList)
最后在 sapply()
:
中将字符变量渲染为因子调用 as.factor()
rdf <- data.frame(sapply(rdf, as.factor))
str(rdf)
# 'data.frame': 4 obs. of 5 variables:
# $ val : Factor w/ 2 levels "val1","val2": 1 1 2 2
# $ obs : Factor w/ 2 levels "1","2": 1 2 1 2
# $ bob : Factor w/ 2 levels "bad","good": 1 2 1 2
# $ george: Factor w/ 2 levels "bad","good": 2 1 2 1
# $ sally : Factor w/ 2 levels "bad","good": 2 2 1 2
有数以千计的答案描述了如何从宽变长并按特定变量进行组织。我不知道我没有在思考什么。 我需要将最初以 rater、obs、val1、val2 等开头的行组织到 IRR 的 rater 下的列中。
给定类似于我的数据的格式,可以使用以下格式创建:
r1 <- c('bob', 'sally', "george", "bob", "sally", "george")
r2 <- c(1,1,1,2,2,2)
r3 <- c("bad", "good", "good", "good", "good", "bad")
r4 <- c("bad", "bad", "good", "good", "good", "bad")
df=data.frame(r1,r2,r3,r4)
df = setNames(df, c('rater','obs', 'val1', 'val2'))
我需要根据 'rater' 将数据组织到列中。任何有用的东西都会很棒,特别是如果可以保留 'obs'(观测值),例如 obs1_val1、obs1_val2 等
对于类似的东西:
dcast(df, obs ~ rater)
创建:
obs bob george sally
1 1 bad good bad
2 2 good bad good
但是,这会聚合并删除 val2 的值。
相反,我需要以下内容:
bob sally george
obs1_val1 bad good good
obs1_val2 bad bad good
obs2_val1 good good bad
obs2_val2 good good bad
查看类似的 responses,我看到了对 melt
的建议,然后是 dcast
[我实际上并不想聚合 - 而是只是按列堆叠]。
因为 val1 和 val2 的字符串应该是我尝试过的因素:
df$"val1" <- factor(df$val1, levels=c("bad","good"))
df$"val2" <- factor(df$val2, levels=c("bad","good"))
没有任何效果。获取:
Aggregation function missing: defaulting to length
obs bob george sally
1 1 2 2 2
2 2 2 2 2
这没有帮助。
?
tidyverse 选项。
library(tidyverse)
df %>%
gather(val1, val2, key = "eval", value = "value") %>%
spread(key = rater, value = value)
然后您可以选择完全删除 'obs' 列或使用 unite()
.
考虑对 val1 和 val2 列进行 rbinding dcast()
调用。此外,添加一列以捕获相应的 val 值(因为它在 dcast
期间被删除)。因此,使用 data.frame()
:
rdf <- rbind(data.frame(val=c("va1"), dcast(df, obs ~ rater, value.var="val1")),
data.frame(val=c("va2"), dcast(df, obs ~ rater, value.var="val2")))
# val obs bob george sally
# 1 va1 1 bad good good
# 2 va1 2 good bad good
# 3 va2 1 bad good bad
# 4 va2 2 good bad good
如果有很多 val 列,用 lapply()
迭代,然后在列表上 do.call(rbind, ...)
迭代:
valcols <- names(df)[grep("val", names(df))]
dfList <- lapply(valcols, function(v) {
data.frame(val=c(v), dcast(df, obs ~ rater, value.var=v))
})
rdf <- do.call(rbind, dfList)
最后在 sapply()
:
as.factor()
rdf <- data.frame(sapply(rdf, as.factor))
str(rdf)
# 'data.frame': 4 obs. of 5 variables:
# $ val : Factor w/ 2 levels "val1","val2": 1 1 2 2
# $ obs : Factor w/ 2 levels "1","2": 1 2 1 2
# $ bob : Factor w/ 2 levels "bad","good": 1 2 1 2
# $ george: Factor w/ 2 levels "bad","good": 2 1 2 1
# $ sally : Factor w/ 2 levels "bad","good": 2 2 1 2