我是R的新手,请耐心等待!我有一个名为 State City
DL KarolBag
DL Ashok Nagr
UP Noida
UP Lucknow
的数据框。以下是相关列的示例:
mydata
现在,我想要完成的工作如下:我想选择Backlog.Item.Type State Task.Initial.Hours.Estimate Task.Completed.Hours
Epic In Progress NA NA
Feature New NA NA
Product Backlog Item Done NA NA
Task Done 5.00 0.50
Task Done 3.00 0.50
Task Done 5.50 6.50
Task Done 2.50 3.00
Task Done 2.00 5.50
Task Done 2.00 3.00
Product Backlog Item Done NA NA
Product Backlog Item Done NA NA
Product Backlog Item Approved NA NA
Task In Progress NA NA
=任务的值,Backlog.Item.Type
=完成和State
& Task.Initial.Hours.Estimate
不是N / A或0.00。一旦选择了满足这些条件的行,我想对它们执行以下计算:Task.Completed.Hours
/(除以)Task.Completed.Hours
x(乘以)100。然后我想存储这个新的新列中的值并计算整个列的平均值。在此先感谢,我希望我已经足够清楚,并以可理解的方式提出我的问题!
答案 0 :(得分:0)
您可以构建logical
向量,其中TRUE
表示您感兴趣的样本,而FALSE
表示样本不是您感兴趣的。
如果没有访问数据就很难构建正确的代码,但我会尽力帮助您(考虑data
是您显示的矩阵的名称)。
# Build the logical vector (according to what you mentioned)
# First condition
cond1 <- data$Backlog.Item.Type == "Task"
# Second condition
cond2 <- !data$Task.Initial.Hours.Estimate %in% c("NA", 0)
# Third condition
cond3 <- !data$Task.Completed.Hours %in% c("NA",0)
# The final logical vector can be computed
l <- as.logical(cond1*cond2*cond3)
# Take the subset of samples satisfying the three conditions
sub.data <- data[l,]
# The new value
new <- 100*sub.data$Task.Completed.Hours/sub.data$Task.Initial.Hours.Estimate
# Add new into tha table
sub.data$new <- new
答案 1 :(得分:0)
试试这个:
library(tidyverse)
result <- mydata %>%
as_tibble() %>%
filter(Backlog.Item.Type=="Task" &
State=="Done" &
Task.Completed.Hours>0) %>%
mutate(new_var=Task.Completed.Hours/Task.Initial.Hours.Estimate*100)
输出是:
# A tibble: 6 x 5
Backlog.Item.Type State Task.Initial.Hours.Estimate Task.Completed.Hours new_var
<chr> <chr> <dbl> <dbl> <dbl>
1 Task Done 5.00 0.500 10.0
2 Task Done 3.00 0.500 16.7
3 Task Done 5.50 6.50 118
4 Task Done 2.50 3.00 120
5 Task Done 2.00 5.50 275
6 Task Done 2.00 3.00 150
答案 2 :(得分:0)
你确实在你的问题中提到过你在R上变暖了,但是如果你对这个问题进行试验,它对每个人都会有用。
如何根据您的要求对数据框here进行子集化(选择行或列),这是一个很好的资源。
现在,假设df
是您的数据框。
在R中,数据帧按以下格式进行子集化:
df[ROWs,COLUMNs]
虽然您可以在方括号内传递行/列号以对数据帧进行子集化,但一种非常有用的方法是使用逻辑向量。
例如:
df <- mtcars
#Create a logical vector to subset rows
logical_vector <- df$mpg > 20
#Use logical_vector to subset df
df[logical_vector,]
这将选择每加仑行驶里程大于20的所有行。
关于你的问题:
您应首先创建一个处理所有条件的逻辑向量:
####CONDITIONS
cond1_vec <- df$Backlog.Item.Type == "Task"
cond2_vec <- df$State == "Done"
#Next condition should check that Task.Completed.Hours is NOT empty OR 0.
cond3_vec <- (!is.na(df$Task.Completed.Hours) | df$Task.Completed.Hours != 0)
#Next condition should check that Task.Initial.Hours.Estimate is NOT empty OR 0.
cond4_vec <- (!is.na(df$Task.Initial.Hours.Estimate) | df$Task.Initial.Hours.Estimate != 0)
####SUBSETTING
#Now, select only those rows which satisfy ALL of the above conditions
#That's why we join the conditions using AND (&)
row_select_vector <- cond1_vec & cond2_vec & cond3_vec & cond4_vec
#Use the method of subsetting dataframes using logical vectors
df_selected <- df[row_select_vector,]
####NEW COLUMN
#Now create a new column which gives the quotient of Hours by Estimate
df_selected$Ratio <- df_selected$Task.Completed.Hours / df_selected$Task.Initial.Hours.Estimate
####FINAL CALCULATION
#Calculate mean
ratio_mean <- mean(df_selected$Ratio)
很少有事情需要注意:
is.na()
用于检查字段是否为NA。执行df$field == NA
您可以在子集中将所有条件组合在行字段中。但是,当你有很多条件需要检查时,创建一个不同的逻辑向量会更加清晰。
查看R中的subset()
功能 - 您可能会觉得更容易。