我有一个ppts'年龄的数据集在一列中(选项:17-22)。如果某个ppt超过22,则它们的值为8,在下一列中,他们将输入一个与其年龄相符的评论。
我尝试用if语句编写for循环:
for(i in 1:nrows(df){
if(df$Age[i] == 8){
#extract the numerical value in $Age.comment[i] and replace
#df$Age[i] with this value
}
}
因为$ Age.comment是一个因素($ Age是数字),并且级别包含数字和字符,我很难过如何做到这一点。
任何帮助将不胜感激!!谢谢!
答案 0 :(得分:1)
这应该让你接近。
df <- data.frame(Age = 1:8, Age.comment = paste(16:23, LETTERS[1:8]))
df
# Age Age.comment
# 1 1 16 A
# 2 2 17 B
# 3 3 18 C
# 4 4 19 D
# 5 5 20 E
# 6 6 21 F
# 7 7 22 G
# 8 8 23 H
ifelse(df$Age == 8, gsub("\\D", "", df$Age.comment), df$Age)
#[1] "1" "2" "3" "4" "5" "6" "7" "23"
正则表达式"\\D"
表示“匹配所有非数字字符”。我们用空格替换这些只留下数字。
答案 1 :(得分:0)
以下是使用parse_number
tidyverse
的选项
library(tidyverse)
library(data.table)
setDT(df)[, New := Age][Age==8, New := parse_number(Age.comment)]
df$New
#[1] 1 2 3 4 5 6 7 23