【发布时间】:2021-08-26 03:10:36
【问题描述】:
我有一个数据框 df,如下所示:
输入:
df <- read.table(text =
"ID Q1_PM Q1_TP Q1_overall Q2_PM Q2_LS Q2_overall
1 1 2 3 1 2 2
2 0 NA NA 2 1 1
3 2 1 1 3 4 0
4 1 0 2 4 0 2
5 NA 1 NA 0 NA 0
6 2 0 1 1 NA NA"
, header = TRUE)
期望的输出:
为了进一步解释,我想要的输出如下:
ID Q1_PM Q1_TP Q1_overall Q2_PM Q2_LS Q2_overall Q1_check Q2_check
1 1 2 3 1 2 2 "above" "within"
2 0 NA NA 2 1 1 NA "within"
3 2 1 1 3 4 0 "within" "below"
4 1 0 2 4 0 2 "above" "within"
5 NA 1 NA 0 NA 0 NA "within"
6 2 0 1 1 NA NA "within" NA
说明:
示例 1:
根据Q1_PM 和Q1_TP 列中的值,我想查看Q1_overall 列中的值是否在它们的范围内?如果不在范围内,值是高于还是低于范围?为了跟踪这一点,我想添加一个额外的列Q1_check。
示例 2:
同样,基于Q2_PM 和Q2_LS 的值,我想检查Q2_overall 的值是否在它们的范围内?如果不在范围内,它是高于还是低于范围?同样,为了跟踪这一点,我想添加一个额外的列 Q2_check
要求:
1- 为此,我想添加额外的列Q1_check 和Q2_check,其中第一列用于涉及Q1 项目的比较,第二列用于涉及Q2 项目的比较。
2- 列可以包含以下值:above、below 和 within。
3- 如果名为overall 的列有NAs,那么额外的列也可能有NAs。
相关帖子:
我查找了相关的帖子,例如: Add column with values depending on another column to a dataframe 和Create categories by comparing a numeric column with a fixed value 但我遇到了如下所述的错误。
部分解决方案:
我能想到的唯一解决方案是:
df$Q1_check <- ifelse(data$Q1_overall < data$Q1_PM, 'below',
ifelse(data$Q1_overall > data$Q1_TP, 'above',
ifelse(is.na(data$Q1_overall), NA, 'within')))
但它会导致以下错误:Error in data$Q1_overall : object of type 'closure' is not subsettable。我不明白可能的问题是什么。
或
df %>%
mutate(Regulation = case_when(Q1_overall < Q1_PM ~ 'below',
Q1_overall > Q1_TP ~ 'above',
Q1_PM < Q1_overall < Q1_TP, 'within'))
这也会导致错误Error: unexpected '<' in: "Q1_overall > Q1_TP ~ 'above', Q1_PM < Q1_overall <"
编辑 1:
如果(比方说)这些列是这些,如何扩展解决方案:
"Q1 Comm - 01 Scope Thesis"
"Q1 Comm - 02 Scope Project"
"Q1 Comm - 03 Learn Intern"
"Q1 Comm - 04 Biography"
"Q1 Comm - 05 Exhibit"
"Q1 Comm - 06 Social Act"
"Q1 Comm - 07 Post Project"
"Q1 Comm - 08 Learn Plant"
"Q1 Comm - 09 Study Narrate"
"Q1 Comm - 10 Learn Participate"
"Q1 Comm - 11 Write 1"
"Q1 Comm - 12 Read 2"
"Q1 Comm - Overall Study Plan"
我们如何识别Q1 Comm - Overall Study Plan 列何时是:
1 - Below 所有其他列的min(),或
2 - Above 所有其他列的max(),或
3 - Within 所有其他列的范围
编辑 2:
对于更新的字段,我还包括dput(df)
dput(df)
structure(list(ï..ID = c(10L, 31L, 225L, 243L), Q1.Comm...01.Scope.Thesis = c(NA,
2L, 0L, NA), Q1.Comm...02.Scope.Project = c(NA, NA, NA, 2L),
Q1.Comm...03.Learn.Intern = c(4L, NA, NA, NA), Q1.Comm...04.Biography = c(NA,
NA, NA, 1L), Q1.Comm...05.Exhibit = c(4L, 2L, NA, NA), Q1.Comm...06.Social.Act = c(NA,
NA, NA, 3L), Q1.Comm...07.Post.Project = c(NA, NA, 3L, NA
), Q1.Comm...08.Learn.Plant = c(NA, NA, NA, 4L), Q1.Comm...09.Study.Narrate = c(NA,
NA, 0L, NA), Q1.Comm...10.Learn.Participate = c(4L, NA, NA,
NA), Q1.Comm...11.Write.1 = c(NA, 2L, NA, NA), Q1.Comm...12.Read.2 = c(NA,
NA, 1L, NA), Q1.Comm...Overall.Study.Plan = c(4L, 1L, 2L,
NA), X = c(NA, NA, NA, NA), X.1 = c(NA, NA, NA, NA), X.2 = c(NA,
NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L
))
任何关于如何实现这一目标的建议将不胜感激。谢谢!
【问题讨论】:
-
你得到的错误是因为
data$Q1-overall被解析为data$Q1 - overall;你想要data$`Q1-overall` -
为什么列名不一致?例如,为什么是
Q1-TP而不是Q1-LS? -
在我的情况下有多种不同的措施,为了模拟它,我制作了
Q1-TS和Q1-LS。如果两者都作为TP或两者都作为LS有助于简化解决方案,请提出建议。我可以做其他操作。 -
感谢@AnilGoyal 的快速回复。我已经更新了我的问题以解决您的评论。现在清楚了吗?
-
我还包含了扩展版本的 dput(df)。
标签: r range max comparison min