希望格式化是正确的,这是我的第一个问题。
这是代码:
a<-c("alice", "bob", "chris")
b<-c("Ally", "Billy", "Chaz")
c<-c("Arnice", "Brandon", "Charles")
df1<-data.frame(a,b,c)
df2<-c("0","0","0")
df2<-data.frame(df2)
for (n in nrow(df1)) {
df2[[n,1]]<-df1[[n,n]]
}
print(df2)
换句话说,我希望沿着数据帧df1的对角线获取字符串(我需要做一些更复杂的事情,所以我正在寻找一般答案),并将结果写入DF2。所以我想要的结果是一个矢量,上面写着爱丽丝,比利,查尔斯。但相反,我得到一个说0,0,NA的矢量。
我做错了什么?任何帮助表示赞赏!
答案 0 :(得分:3)
将diag
转换为data.frame
后使用matrix
功能:
diag(as.matrix(df1))
# [1] "alice" "Billy" "Charles"
假设您的数据是方形(行数和列数相同),您可以手动执行以下操作:
df1[cbind(1:nrow(df1), seq_len(ncol(df1)))]
在您目前的代码中,您使用的是双括号([[
)和factors
,这两种情况都会产生问题。
与下面的比较,我在创建空&#34; df2&#34;时添加了stringsAsFactors = FALSE
,并使用as.character
将输出转换为字符:
df2 <- c("0","0","0")
df2 <- data.frame(df2, stringsAsFactors = FALSE)
for (n in seq_len(nrow(df1))) {
print(df1[n, n])
}
# [1] alice
# Levels: alice bob chris
# [1] Billy
# Levels: Ally Billy Chaz
# [1] Charles
# Levels: Arnice Brandon Charles
for (n in seq_len(nrow(df1))) {
df2[n, 1] <- as.character(df1[n, n])
}
df2
# df2
# 1 alice
# 2 Billy
# 3 Charles