![](/img/trans.png)
[英]How do I create variables in R that count the number of values of one variable by another variable?
[英]How do I create two new variables out of one variable, and attach dummy values to it in R?
我对任何类型的编码都是全新的,尤其是 R,所以我在谷歌上搜索的日子并不是很有帮助。 我真的很感激任何帮助/见解!
我想知道如何从原始变量中获取两个新变量,并为其附加新值 - 基本上我从这个开始:
并想得到这个:
我设法用melt(dataname, id.vars=c("ID"))
得到它的长格式,我得到的 ID 和值很好。 但是只有一个变量,我的四个标题(loudHot、quietHot、loudCold、quietCold)重复了 - 我如何从中创建两个新变量并为其分配值(例如,“Volume”的值是 1 当原始变量是 loudHot 或 loudCold,如果是 quietHot 或 quietCold,则为 0,然后当原始变量为 loudHot 或 quietHot 时,“Temp”为 1,当它的 loudCold 或 quietCold 时为 0)?
我不会对自己太苛刻 - 这并不是微不足道的。 无论如何,您可以使用pivot_longer
中的tidyr
和dplyr
进行一些数据操作来实现您想要的结果:
library(dplyr)
library(tidyr)
df %>%
pivot_longer(-ID) %>%
mutate(Volume = as.numeric(grepl("loud", name)),
Temp = as.numeric(grepl("Hot", name))) %>%
select(ID, Volume, Temp, value)
#> # A tibble: 32 x 4
#> ID Volume Temp value
#> <dbl> <dbl> <dbl> <dbl>
#> 1 2 1 1 14
#> 2 2 0 1 16
#> 3 2 1 0 16
#> 4 2 0 0 15
#> 5 4 1 1 19
#> 6 4 0 1 15
#> 7 4 1 0 10
#> 8 4 0 0 8
#> 9 6 1 1 11
#> 10 6 0 1 17
#> # ... with 22 more rows
数据
df <- data.frame(ID = (1:8) * 2,
loudHot = c(14, 19, 11, 20, 18, 17, 16, 2),
quietHot = c(16, 15, 17, 5, 10, 10, 15, 0),
loudCold = c(16, 10, 10, 4, 3, 2, 14, 2),
quietCold = c(15, 8, 17, 8 ,10, 12, 5, 0))
作为任何未来 SO 问题的提示,请不要发布数据图像。 这里的人们需要能够剪切和粘贴数据文本以测试和验证解决方案。 理想情况下,您应该通过将输入 function 的dput
放入代码块中来执行此操作。 人们很少会从图像中手动转录数据。
由代表 package (v2.0.1) 于 2022 年 2 月 4 日创建
以免使用dplyr
和tidyr
包来解决您的问题。
对您的第一个建议是始终添加您的数据的最小可重现示例,以便我们使用它并更快地帮助您。 这并不复杂,您可以使用dput(head(yourdata, 10))
,例如,或模拟一些观察。
我做了一个模拟如下:
library(dplyr)
library(tidyr)
data <- data.frame(
id = 1:5,
loudHot = sample(10:20, 5, replace = TRUE),
quieHot = sample(10:20, 5, replace = TRUE),
loudCold = sample(0:12, 5, replace = TRUE),
quiteCold = sample(0:12, 5, replace = TRUE)
)
现在我们有了数据,不要使用tidyr::pivot_longer
将其转换为长格式。 此 function 将 dataframe 以宽格式作为参数,您想要收集的列(或您不想使用-
符号收集的列)。
# Data to long format
data_long <- pivot_longer(
data, cols = -id,
names_to = 'variable', values_to = 'value'
)
有了它,现在您只需要创建虚拟对象,这很简单。
# Adding new variables
data_with_dummy <- mutate(
data_long,
volume = as.numeric(variable %in% c('loudHot', "loudCold")),
temp = as.numeric(variable %in% c('loudHot', "quietCold"))
)
这是一个基本的 R 方法:
# Original data
df <- data.frame(
ID = c(2, 4, 5, 7, 8, 11, 12, 16),
loudHot = c(14, 19, 11, 20, 18, 17, 16, 2),
quietHot = c(16, 15, 17, 5, 10, 10, 15, 0),
loudCold = c(16, 10, 10, 4, 3, 2, 14, 2),
quietCold = c(15, 8, 17, 8, 10, 12, 5, 0)
)
# Stacked data
df_stacked <- stack(
df,
select = c(
"loudHot", "quietHot", "loudCold", "quietCold"
)
)
# New variable for volume
df_stacked$Volume <- as.numeric(grepl("loud", df_stacked$ind))
# New variable for Temp
df_stacked$Temp <- as.numeric(grepl("Hot", df_stacked$ind))
# Replace "ind" values with "ID"
df_stacked$ind <- rep(df$ID, times = 4)
# Reorder columns
new_df <- df_stacked[,c(2:4,1)]
# Rename columns
colnames(new_df) <- c("ID", "Volume", "Temp", "Value")
# Order by ID
new_df[order(new_df$ID),]
我相信您的“音量”和“温度”列应该是交替序列:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.